SpringBoot中处理的转发与重定向

转发:一次请求,服务器内部调用另外的组件处理,request和response可以共用,有限制性,只能转发到本应用中的某些资源,页面或者controller请求

课可以访问WEB-INF目录下面的页面

 

重定向:两次请求,地址会改变,request和response不能共用,不能直接访问WEB-INF下面的资源,

 

根据所要跳转的资源,可以分为跳转到页面或者跳转到其他controller

一、返回ModelAndView时的请求转发

当controller中的方法返回ModelAndView的时候,默认是使用的转发。当然,我们也可以显式的指出要使用转发,此时,需在 setViewName()指定的视图前添加forward:,此时springmvc.xml文件中配置的视图解析器将会失效,即需要在setViewName中写上jsp相对于项目根的路径。

1:转发到页面

/**
 * 转发返回ModelAndView对象
 * @return
 * @throws Exception
 */
@RequestMapping("/forwardMAV.do")
public ModelAndView forwardMAV()throws Exception{

    ModelAndView mv = new ModelAndView();
    mv.addObject("type", "转发返回ModelAndView");
    //默认情况下使用转发
    //mv.setViewName("/result");

    //手动显式指定使用转发,此时springmvc.xml配置文件中的视图解析器将会失效
    mv.setViewName("forward:/jsp/result.jsp");
    return mv;
}

需要在webapp目录下添加jsp/result.jsp文件:

2:转发到controller

使用转发跳转到其他controller中

@RequestMapping("/forwardMAV.do")
public ModelAndView forwardMAV()throws Exception{

    ModelAndView mv = new ModelAndView();

    //手动显式指定使用转发,此时springmvc.xml配置文件中的视图解析器将会失效
    mv.setViewName("forward:other.do");
    return mv;
}

创建OtherController:

/**
 * 被跳转的controller
 */
@Controller
public class OtherController {

    /**
     * 被跳转的controller返回result.jsp
     * @return
     * @throws Exception
     */
    @RequestMapping("/other.do")
    public ModelAndView other()throws Exception{

        ModelAndView mv = new ModelAndView();
        mv.addObject("type", "被跳转的controller");

        mv.setViewName("result");
        return mv;
    }
}

二、返回ModelAndView时的重定向:发送的get请求,参数在url后面

如果要实现重定向,则需在setViewName()指定的视图前添加redirect:,此时springmvc.xml文件中配置的视图解析器将会失效,即需要在setViewName中写上jsp相对于项目根的路径。重定向的方式在request域中的数据会失效,此时可以通过ModelAndView来传递数据,但是只能传递基本数据类型和String类型,因为spring mvc会将传递的数据以请求参数的方式放到url的后面,此时任何数据类型都会被转换为普通的字符串。另外,我们在jsp中取值的时候需要使用 EL 表达式中的请求参数param读取。

除此之外,你还可以将数据放到HttpSession域中,这里就不演示了。

1.重定向到页面

/**
 * 重定向返回ModelAndView对象
 * @return
 * @throws Exception
 */
@RequestMapping("/redirectMAV.do")
public ModelAndView redirectMAV(School school,String name)throws Exception{

    ModelAndView mv = new ModelAndView();

    //在重定向中可以使用ModelAndView传递数据,但是只能传递基本数据类型和String类型
    mv.addObject("school",school);
    mv.addObject("name", name);

    //使用重定向,此时springmvc.xml配置文件中的视图解析器将会失效
    mv.setViewName("redirect:/jsp/result.jsp");
    return mv;

result.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

${school.schoolName}<br>
${param.school.address}<br>
${param.name}
</body>
</html>

2,重定向到controller
在重定向到其他controller中的方法的时候,只要保证两者的参数名一致即可实现数据的传递。

@RequestMapping("/redirectMAV.do")
public ModelAndView redirectMAV(School school,String name)throws Exception{

    ModelAndView mv = new ModelAndView();

    mv.addObject("name", name);
    mv.addObject("schoolName", school.getSchoolName());
    mv.addObject("address", school.getAddress());

    System.out.println(school.getAddress());
    //使用重定向,此时springmvc.xml配置文件中的视图解析器将会失效
    mv.setViewName("redirect:other.do");
    return mv;
}
RequestMapping("/other.do")
public ModelAndView other(String name, School school)throws Exception{

    ModelAndView mv = new ModelAndView();

    //单个接收
    mv.addObject("name", name);

    //通过javabean对象接收
    mv.addObject("school", school);

    System.out.println(school.getAddress());
    mv.setViewName("result");

    return mv;
}

 

返回String类型的转发

这个整体上跟之前ModelAndView差不多,只不过在controller中的方法参数会被自动的放到request域中。

@RequestMapping("/forwardStr.do")
public String forwardStr(School school)throws Exception{

    //默认会使用转发
    //return "result";
    //显式的使用转发
    return "forward:/jsp/result.jsp";
}

result.jsp中直接通过request域获取数据,以下两种方式均可。

${requestScope.school.schoolName}

${school.schoolName}

返回String类型的重定向

这里要想传递数据的话,需要使用之前介绍过的Model实现,这里的数据同样会放在url中,所以只能传递基本数据类型和String类型。

@RequestMapping("/redirectStr.do")
public String redirectStr(School school, Model model)throws Exception{

    //这里的数据同样会放在url中,所以只能传递基本数据类型和String类型
    model.addAttribute("schoolName", school.getSchoolName());
    model.addAttribute("address", school.getAddress());

    return "redirect:/jsp/result.jsp";
}

result.jsp中需要通过param来获取数据:

${param.schoolName}

${param.address}

这里转发和重定向跟之前返回ModelAndView的时候一样,所以就不演示了。

 

返回void的重定向和转发

当方法没有返回值即返回void的时候,重定向和转发操作都是使用的servlet的api,就是:
转发:

request.getRequestDispatcher("/jsp/result.jsp").forward(request, response);

重定向:

response.sendRedirect(request.getContextPath()+"/jsp/result.jsp");

 

***************************************

@RequestMapping(value="/aa",method=RequestMethod.GET)

public ModelAndView aaa (HttpServletRequest request) {

String user  =  request.getParameter("username");

ModelAndView  mv = new ModelAndView ("xyxyh/declaration/delcleView");

mv.addObject("pas","bb"):

return mv

}

@RequestMapping(value="/aa",method=RequestMethod.GET)

public ModelAndView aaa (HttpServletRequest request,ModelMap model) {

String user  =  request.getParameter("username");

ModelAndView  mv = new ModelAndView ("xyxyh/declaration/delcleView");

mv.addObject("pas","bb"):

model.addAttribute("typeFlag","aaaaa");
return mv

}

 

### Spring Boot Session超时时自动重定向至登录页 为了实现当会话过期时自动跳转到特定页面的功能,在Spring Security框架下可以通过自定义`SecurityConfig`来完成这一需求。如果项目并未引入Spring Security,则需通过监听HttpSession事件的方式处理。 对于已集成Spring Security的应用程序而言,可以在安全配置类中设置未认证用户的默认目标地址: ```java @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/login", "/css/**").permitAll() //允许匿名访问登陆界面及相关资源 .anyRequest().authenticated()//其他请求都需要验证身份 .and() .formLogin() .loginPage("/login")//指定登录表单位置 .defaultSuccessUrl("/")//成功后的转向链接,默认根目录 .failureUrl("/login?error=true")//失败后返回带错误提示参数的登录页 .and() .logout() .clearAuthentication(true)//登出操作清除认证信息 .invalidateHttpSession(true)//使HTTP会话失效 .deleteCookies("JSESSIONID")//删除cookie防止浏览器缓存凭证 .logoutUrl("/perform_logout")//执行注销动作所需路径 .logoutSuccessUrl("/login?loggedout=true");//退出成功的回调url //设定session管理策略 http.sessionManagement() .invalidSessionUrl("/login?expired=true"); //会话无效(如超时)则导向此URL //启用CSRF防护机制(可选) http.csrf().disable(); } } ``` 上述代码片段展示了如何利用Spring Security特性定制化应用程序的安全行为,特别是针对未经验证或会话已经结束的情况作出响应[^1]。 如果不适用Spring Security组件而仅依靠Servlet API的话,则可以创建一个过滤器用于捕捉非法状态异常并实施相应的转发逻辑: ```java @Component @WebFilter(urlPatterns = "/*") public class CustomSessionTimeoutFilter implements Filter { private static final Logger logger = LoggerFactory.getLogger(CustomSessionTimeoutFilter.class); @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest)req; HttpServletResponse httpResponse = (HttpServletResponse)resp; HttpSession session = httpRequest.getSession(false); if(session==null || session.getAttribute("user")==null){ String contextPath=httpRequest.getContextPath(); httpResponse.sendRedirect(contextPath+"/login?timeout=true"); return ; } try{ chain.doFilter(req,resp); }catch(IllegalStateException e){ logger.error(e.getMessage(),e); throw new RuntimeException("The response has already been committed."); } } @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void destroy() {} } ``` 这段Java代码实现了对所有进入系统的HTTP请求进行预检的工作流程;一旦发现不存在有效的用户对象于当前会话之中便立即中断正常的服务调用链路,并强制客户端重新导航回登录入口处[^2]。 另外需要注意的是,除了编程手段外还可以借助application.properties 或 application.yml 来调整服务器层面关于会话的有效期限以及存储模式等选项,从而间接影响到用户体验的一致性和安全性。例如修改Tomcat容器内建的会话持久化时间长度: ```properties server.servlet.session.timeout=30m # 设置为三十分钟 ``` 或者采用更灵活的数据结构保存在线记录以便更好地支持分布式部署场景下的共享读写能力[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值