【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
过滤器的类如下:
package com.agen.util; import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import org.springframework.util.Assert;
import org.springframework.util.StringUtils; import com.agen.entity.User; /**
* 首先写一个登录权限过滤类--LoginFilter类实现Filter接口
* @author 申旭栋
*下面这三个方法是必须要实现的
*/
public class LoginFilter implements Filter { @Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub } @Override
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
// 获得在下面代码中要用的request,response,session对象
HttpServletRequest servletRequest = (HttpServletRequest) request;
HttpServletResponse servletResponse = (HttpServletResponse) response;
HttpSession session = servletRequest.getSession(); // 获得用户请求的URI
String path = servletRequest.getRequestURI(); // 从session里取用户的登陆ID
User user = (User) session.getAttribute("user"); // 登陆页面无需过滤
if("/biologyInfo/".equals(path) || "/biologyInfo/login/login1.htmls".equals(path)) {
chain.doFilter(servletRequest, servletResponse);
return;
} // 判断如果没有取到员工信息,就跳转到登陆页面 StringUtils.isEmpty(username)等价于username == null || "".equals(username)
if (user == null) {
// 跳转到登陆页面
servletResponse.sendRedirect("login/login1.htmls");
} else {
// 已经登陆,继续此次请求
chain.doFilter(request, response);
} } @Override
public void destroy() {
// TODO Auto-generated method stub } }
web.xml中的配置如下:
<!-- 配置了springmvc拦截的url为以.hmls结尾的请求 -->
<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>*.htmls</url-pattern>
</servlet-mapping> <filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
错误原因:
其实很简单,就是过滤器类中的这一段中路径给的有问题:
if (user == null) {
// 跳转到登陆页面
servletResponse.sendRedirect("login/login1.htmls");
} else {
// 已经登陆,继续此次请求
chain.doFilter(request, response);
}
修改方式:
我们应该把路径给成这样就可以了:
if (user == null) {
// 跳转到登陆页面
servletResponse.sendRedirect("/biologyInfo/login/login1.htmls");
} else {
// 已经登陆,继续此次请求
chain.doFilter(request, response);
}
补充:
解释:
其实修改的点就是: /login/login1.htmls
这个login前面加上/就表示是绝对路径了。而写成这样:login/login1.htmls,就是相对路径。
相对路径就会在每一次重定向的时候,在原有的基础上再去增加:
看一看
Controller的代码如下:
@Controller()
@RequestMapping("login")
public class LoginController {
而这个controller就死相对路径的原有基础:
就是LoginController的路径就是http://192.168.16.104:8080/biologyInfo/login/,
所以,如果写的是相对路径,每次都会在这个基础上加上login/login1.htmls。
这就造成了页面重定向循环的问题。
【Filter 页面重定向循环】写一个过滤器造成的页面重定向循环的问题的更多相关文章
- 【Filter 不登陆无法访问】web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面的功能
在web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面,而重定向到登陆界面的功能. 项目是用springMVC+spring+hibernate实现 (和这个没有多大关系) 第一步: 首先 ...
- 用php怎么写一个用户注册登录的页面呢?
想写就会尽快去写.如果用php写了就一定要用nodejs写出来啊,不写是小狗啊! 补充一下,想要实现的功能: 1.用户名重复检测 2.检测信息填写是否完整 3.邮箱是否已经被注册 4.实现ajax无刷 ...
- Layui 写一个简单的后台页面
参考如下: 1.layui 官方文档 http://www.layui.com/doc/ 2.https://blog.csdn.net/huyanliang/article/details/7796 ...
- php写一个简洁的登录页面
在学php中,刚刚看完实战演练就写了个登录页面 1.表单解析图 这是我们要写的 先用html写个表单先 <html> <head> <title>login< ...
- 用flutter写一个精美的登录页面
先看效果图: 源代码已上传到github 我们先看一下页面 , 首先这个页面,我们并没有用到AppBar,当然也就没有自带返回功能.然后下面有个Login的文字以及一条横线. 屏幕中上方是填写帐号以及 ...
- 用while循环写一个简单的猜数字游戏
import random #练习:模拟猜数字的游戏 """ 计算机出一个1~100之间的随机数由人来猜 计算机根据人猜的数字分别给出 大一点/小一点/猜中了 的提示 & ...
- (研)for循环的一个bug以及3个while循环的快排
在这个for循环中,只要有一次不满足,这个for循环将break掉 while(p->score>=90&&i<5) count++ //若有一次不满足的话,那么整个 ...
- 循环输出 一个li里边两个图片循环
<ul> <li><img src="123454"/><img src="123454"/></li&g ...
- [双重 for 循环]打印一个倒三角形
[双重 for 循环]打印一个倒三角形 核心算法 里层循环:j = i; j <= 10; j++ 当i=1时,j=1 , j<=10,j++,打印10个星星 当i=2时,j=2 , j& ...
随机推荐
- winrt获取文件MD5码
//小文件 public static string ComputeMD5(byte[] bytes) { var alg = HashAlgorithmProvider.OpenAlgorithm( ...
- 2.openstack之mitaka搭建控制节点数据库和消息队列
一:部署mariadb数据库 控制节点(192.168.11.103): yum install mariadb mariadb-server python2-PyMySQL -y 编辑: /etc/ ...
- Divide and conquer:Sumsets(POJ 2549)
数集 题目大意:给定一些数的集合,要你求出集合中满足a+b+c=d的最大的d(每个数只能用一次) 这题有两种解法, 第一种就是对分,把a+b的和先求出来,然后再枚举d-c,枚举的时候输入按照降序搜索就 ...
- Debian下查看系统版本信息命令汇总
Debian下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等等,整个CPU信息一目了然. 1.odoo@debian64:~$ uname -a(Debian查看版本当前操 ...
- 手动关闭searchDisplayControlelr
两行代码搞定 [searchBar endEditing:YES]; [searchDisplayControllersetActive:NO];
- RAD Studio/Delphi 2010 3615下载+破解
RAD Studio/Delphi 2010 3615下载+破解 官方下载地址: http://altd.embarcadero.com/download/RADStudio2010/delphicb ...
- Web.Config如何输入特殊字符
- Ubuntu之MaxScale安装配置
原文github:https://github.com/mariadb-corporation/MaxScale/blob/develop/Documentation/Documentation-Co ...
- 常用shell命令操作
1.找出系统中所有的*.c 和*.h 文件 (-o 或者) $find / -name "*.cpp" -o -name "*.h" 2.设定 eth0 的 I ...
- redis配置详情
# Redis configuration file example # Note on units: when memory size is needed, it is possible to sp ...