• 【Filter 页面重定向循环】写一个过滤器造成的页面重定向循环的问题


    今天做一个过滤器,碰上页面重定向循环的情况:

    浏览器的访问路径是:http://192.168.16.104:8080/biologyInfo/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login1.htmls

    过滤器的类如下:

     1 package com.agen.util;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.Filter;
     6 import javax.servlet.FilterChain;
     7 import javax.servlet.FilterConfig;
     8 import javax.servlet.ServletException;
     9 import javax.servlet.ServletRequest;
    10 import javax.servlet.ServletResponse;
    11 import javax.servlet.http.HttpServletRequest;
    12 import javax.servlet.http.HttpServletResponse;
    13 import javax.servlet.http.HttpSession;
    14 
    15 import org.springframework.util.Assert;
    16 import org.springframework.util.StringUtils;
    17 
    18 import com.agen.entity.User;
    19 
    20 /**
    21  * 首先写一个登录权限过滤类--LoginFilter类实现Filter接口
    22  * @author 申旭栋
    23  *下面这三个方法是必须要实现的
    24  */
    25 public class LoginFilter implements Filter {
    26 
    27     @Override
    28     public void init(FilterConfig filterConfig) throws ServletException {
    29         // TODO Auto-generated method stub
    30 
    31     }
    32 
    33     
    34     @Override
    35     public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
    36         // 获得在下面代码中要用的request,response,session对象
    37         HttpServletRequest servletRequest = (HttpServletRequest) request;
    38         HttpServletResponse servletResponse = (HttpServletResponse) response;
    39         HttpSession session = servletRequest.getSession();
    40 
    41         // 获得用户请求的URI
    42         String path = servletRequest.getRequestURI();
    43         
    44         // 从session里取用户的登陆ID
    45         User user = (User) session.getAttribute("user");
    46 
    47         // 登陆页面无需过滤
    48         if("/biologyInfo/".equals(path) || "/biologyInfo/login/login1.htmls".equals(path)) {
    49             chain.doFilter(servletRequest, servletResponse);
    50             return;
    51         }
    52 
    53         // 判断如果没有取到员工信息,就跳转到登陆页面  StringUtils.isEmpty(username)等价于username == null || "".equals(username)
    54         if (user == null) {
    55             // 跳转到登陆页面
    56             servletResponse.sendRedirect("login/login1.htmls");
    57         } else {
    58             // 已经登陆,继续此次请求
    59             chain.doFilter(request, response);
    60         }
    61 
    62     }
    63 
    64     @Override
    65     public void destroy() {
    66         // TODO Auto-generated method stub
    67 
    68     }
    69 
    70 }
    View Code

    web.xml中的配置如下:

     1     <!-- 配置了springmvc拦截的url为以.hmls结尾的请求 -->
     2     <servlet-mapping>
     3         <servlet-name>rest</servlet-name>
     4         <url-pattern>*.htmls</url-pattern>
     5     </servlet-mapping>
     6 
     7     <filter-mapping>
     8         <filter-name>openSessionInViewFilter</filter-name>
     9         <url-pattern>/*</url-pattern>
    10     </filter-mapping>
    View Code

    错误原因:

    其实很简单,就是过滤器类中的这一段中路径给的有问题:

    1  if (user == null) {
    2             // 跳转到登陆页面
    3             servletResponse.sendRedirect("login/login1.htmls");
    4         } else {
    5             // 已经登陆,继续此次请求
    6             chain.doFilter(request, response);
    7         }
    View Code

    修改方式:

    我们应该把路径给成这样就可以了:

    1 if (user == null) {
    2             // 跳转到登陆页面
    3             servletResponse.sendRedirect("/biologyInfo/login/login1.htmls");
    4         } else {
    5             // 已经登陆,继续此次请求
    6             chain.doFilter(request, response);
    7         }
    View Code

    补充:

    解释:

    其实修改的点就是: /login/login1.htmls

    这个login前面加上/就表示是绝对路径了。而写成这样:login/login1.htmls,就是相对路径。

    相对路径就会在每一次重定向的时候,在原有的基础上再去增加:

    看一看

    Controller的代码如下:

    1 @Controller()
    2 @RequestMapping("login")
    3 public class LoginController {
    View Code

    而这个controller就死相对路径的原有基础:

    就是LoginController的路径就是http://192.168.16.104:8080/biologyInfo/login/,

    所以,如果写的是相对路径,每次都会在这个基础上加上login/login1.htmls。

    这就造成了页面重定向循环的问题。

  • 相关阅读:
    PHPMailer邮件发送
    php 统计在线人数,今日访问量,总访问量
    php 首页定时生成静态页面
    jquery自动生成二维码
    php图片等比例缩放
    判断checkbox选中
    Pojo和JavaBean的区别
    Highcharts简单入门
    [转载]了解Activity工作流
    集群和分布式初探
  • 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/5714929.html
Copyright © 2020-2023  润新知