我想使用filter 过滤未登陆的用户,代码如下:
/**
* 功能:过滤器
*/
public class SessionFilter implements Filter { public void init(FilterConfig filterconfig) throws ServletException {
} public void destroy() {
}
/** 过滤方法 */
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// 获取uri地址
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse)resp;
HttpSession session = request.getSession(false);
if(session == null || session.getAttribute("User") == null){
System.out.println("上下文目录:"+request.getContextPath());
response.sendRedirect(request.getContextPath()+"/actions/loginJsp.action");
return ;
}
}
但结果 变成了一个死循环了。理论上 没有问题啊。为什么 会这样。
/**
* 功能:过滤器
*/
public class SessionFilter implements Filter { public void init(FilterConfig filterconfig) throws ServletException {
} public void destroy() {
}
/** 过滤方法 */
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// 获取uri地址
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse)resp;
HttpSession session = request.getSession(false);
if(session == null || session.getAttribute("User") == null){
System.out.println("上下文目录:"+request.getContextPath());
response.sendRedirect(request.getContextPath()+"/actions/loginJsp.action");
return ;
}
}
但结果 变成了一个死循环了。理论上 没有问题啊。为什么 会这样。
你所有的页面都是被拦截器拦截的吧
包括你的登录页面的吧
这个就是原因
另外你应该跳转到都某个jsp或者html中
你又重新跳入了XXXX.action
自然还会拦截你在大脑里稍微模拟下这个过程就能知道这个答案了
chain.doFilter(request, response); 不知道我说的对不对
登录的action ,这不还是执行登录, 于是又进到拦截,如此反复,你返回到login.jsp 它不就回去了
<filter>
<filter-name>SESSION FILTER</filter-name>
<filter-class>com.wlzx.web.common.SessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SESSION FILTER</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>SESSION FILTER</filter-name>
<url-pattern>/actions/*</url-pattern>
</filter-mapping> 如果 不过滤 xx.jsp .那么 就会 进入到 某个后台页面 。
具体的 某个动用 是exposition/actions/loginAction 或 exposition/actions/loginAction!index
过滤器 没有启作用。
<filter-name>SESSION FILTER</filter-name>
<url-pattern>/actions/*</url-pattern>
</filter-mapping>
不要这个 或者把登录页面换个文件夹
后端在/manage/ 包下。这个下边的需要登陆。现在换一种写法。主要代码如下。
public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse, FilterChain chain) {
this.chain = chain;
this.request = (HttpServletRequest) servletRequest;
// 如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法,
// 就要把此request对象构造成HttpServletRequest
this.response = ((HttpServletResponse) servletResponse);
// 获取当前页面文件名此处url为:/Gzlkh/login.jsp
String url = request.getRequestURI();// /exposition/main.jsp
// 此处截取的url为:login.jsp
url = url.substring(url.lastIndexOf("/") + 1, url.length());//main.jsp
try {
HttpSession session = request.getSession();
// 获取网站访问根目录/exposition
String accessPath = request.getContextPath();
// 获取用户登录验证信息
User st = (User) session.getAttribute("user");
if (noFileUrl(url, request)) {
// 不需要判断权限的请求如登录页面,则跳过
chain.doFilter(request, response);// 继续执行请求
} else if (st == null) {
response.sendRedirect(accessPath + "/login.jsp");
// 未登录或超时,返回登陆页面
} else {
verifyUrl(url, st);// 判断当前user是否拥有访问此url的权限
}
} catch (Exception sx) {
sx.printStackTrace();
}
}
web.xml
<filter>
<filter-name>permission</filter-name>
<filter-class>com.wlzx.web.common.PermissionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>permission</filter-name>
<!-- 只过滤 .jsp 结尾的url, 其余的如 .do, .html, .jpg, .css 等不作过滤-->
<url-pattern>*.jsp</url-pattern>
</filter-mapping>还会 进入死循环。这个要可以理解。每次 都要 过滤xx.jsp 页面。所以 就死循环了。
但是 怎么 能让他 跳出。
this.chain = chain;
this.request = (HttpServletRequest) servletRequest;
// 如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法, // 就要把此request对象构造成HttpServletRequest this.response = ((HttpServletResponse) servletResponse); // 获取当前页面文件名此处url为:/Gzlkh/login.jsp String url = request.getRequestURI();// /exposition/main.jspif("/index.jsp".equals(url)) {
chain.doFilter(request,response);
return;
}// 你的过滤逻辑
...
* 功能:过滤器
*/
public class SessionFilter implements Filter { public void init(FilterConfig filterconfig) throws ServletException {
} public void destroy() {
}
/** 过滤方法 */
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// 获取uri地址
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse)resp;
//添加这段代码,排除loginJsp.action
if(request.getRequestURI().endsWith("loginJsp.action")){
chain.doFilter(request, response);
return;
}
HttpSession session = request.getSession(false);
if(session == null || session.getAttribute("User") == null){
System.out.println("上下文目录:"+request.getContextPath());
response.sendRedirect(request.getContextPath()+"/actions/loginJsp.action");
return ;
}
}
不要用重定向,因为使用重定向中有url地址栏重写,而此又符合过滤器条件而再次调用doFilter,致使死循环;所以要用请求转发;
//不需要权限验证的页面动作等
protected boolean noFileUrl(String url, HttpServletRequest request) {
String excludeAll = "login.jsp,first.jsp,down.jsp,top.jsp,center.jsp,left.jsp,right.jsp";
//判断请求页面是否是特殊页面
if (excludeAll.indexOf(url) >= 0) {
return true;
}
return false; }
然后,到了login.jsp 然后,添写 用户 和密码,并不经过 action 的操作,就进来了。这是什么原因。