【Java】JavaWeb登录检查及界⾯跳转
场景
  ⼀般javaweb⽹站都有⽤户登录,⽽有⼀些操作必须⽤户登录才能进⾏,常见流程:⽤户请求--》后台判断是否登录--》没登录跳转到登录界⾯,登录⽤户正常操作
解决思路
  在⽤过滤器过滤请求,判断是否登录,如果未登录,返回参数跳转的登录界⾯,登录了的请求放⾏
具体实现
  新建⼀个web⼯,参考:
  新建⼀个LoginFilter过滤器类,继承Filter类
st.login;
2
3import java.io.IOException;
4import java.io.PrintWriter;
5import java.util.ArrayList;
6import java.util.List;
7
8import javax.servlet.Filter;
9import javax.servlet.FilterChain;
10import javax.servlet.FilterConfig;
11import javax.servlet.ServletException;
12import javax.servlet.ServletRequest;
13import javax.servlet.ServletResponse;
14import javax.servlet.http.HttpServletRequest;
15import javax.servlet.http.HttpServletResponse;
16import javax.servlet.http.HttpSession;
17
18public class LoginFilter implements Filter {
19
20public static List<String> pattenURL = new ArrayList<String>();
21
22    @Override
23public void destroy() {
24// TODO Auto-generated method stub
25
26    }
27
28    @Override
29public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
30throws IOException, ServletException {
31
32        HttpServletRequest httpRequest = (HttpServletRequest) request;
33        HttpServletResponse httpResponse = (HttpServletResponse) response;
34        HttpSession session = Session();
35// 登陆url
36        String loginUrl = ContextPath() + "/login.jsp";
app登录界面
37        String url = RequestURI().toString();
38
39// 注:在pattenURL中的全部不拦截 url.indexOf(urlStr) > -1 表⽰urlStr在url中出现过,出现就不拦截
40for (String urlStr : pattenURL) {
41if (url.indexOf(urlStr) > -1) {
42                chain.doFilter(request, response);
43return;
44            }
45        }
46
47//超时处理,ajax请求超时设置超时状态,页⾯请求超时则返回提⽰并重定向,Attribute("")是获取到登录⼈的session信息
48if (Attribute("") == null) {
49// 判断是否为ajax请求
50if (Header("x-requested-with") != null
51                    && Header("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
52                httpResponse.addHeader("sessionstatus", "timeOut"); // 返回超时标识
53                httpResponse.addHeader("loginPath", loginUrl);// 返回url
54                chain.doFilter(request, response);// 不可少,否则请求会出错
55            } else {
56// alert('会话过期,请重新登录');
57                String str = "<script language='javascript'>" + "p.location.href='" + loginUrl + "';</script>";
58                response.setContentType("text/html;charset=UTF-8");// 解决中⽂乱码
59try {
60                    PrintWriter writer = Writer();
61                    writer.write(str);
62                    writer.flush();
63                    writer.close();
64                } catch (Exception e) {
65                    e.printStackTrace();
66                }
67            }
68        } else {
69            chain.doFilter(request, response);
70        }
71    }
72
73/**
74    * 过滤器初始化调⽤⽅法在pattenURL中的全部不拦截,所以上⾯会使⽤:path.indexOf(urlStr) > -1
75*/
76    @Override
77public void init(FilterConfig config) throws ServletException {
78        pattenURL.add("login.jsp");// 登录jsp
79        pattenURL.add("login.do");// 登录⽅法
80        pattenURL.add("css");// css
81        pattenURL.add("image");// image
82        pattenURL.add("js");// js
83        pattenURL.add("fonts");// fonts
84
85    }
86
87 }
  在l中注册过滤器
1<?xml version="1.0" encoding="UTF-8"?>
2<web-app version="3.0" xmlns="java.sun/xml/ns/javaee"
3    xmlns:xsi="/2001/XMLSchema-instance"
4    xsi:schemaLocation="java.sun/xml/ns/javaee java.sun/xml/ns/javaee/web-app_3_0.xsd">
5
6<display-name>test-login</display-name>
7
8<!-- 登录过滤器  -->
9<filter>
10<description>登录过滤器</description>
11<filter-name>loginFilter</filter-name>
12<filter-class&st.login.LoginFilter</filter-class>
13</filter>
14<filter-mapping>
15<filter-name>loginFilter</filter-name>
16<url-pattern>/*</url-pattern>
17</filter-mapping>
18
19<welcome-file-list>
20<welcome-file>index.jsp</welcome-file>
21</welcome-file-list>
22
23</web-app>
  引⼊⼀个全局的js。⽤户控制ajax请求,如果是ajax请求的话,跳转到登录界⾯。js代码主要是真对所
有ajax请求进⾏跳转的,所以如果有的ajax不想被过滤拦截,则只需要写上:global:false即可不被拦截到
1/*
2 * 说明:此处是调⽤ajax⽅法时,判断session是否过期
3 *
4 * 注:如果不想让ajax⽅法受这个影响,可以在ajax⽅法中写: global:false
5 * 如下:
6 * $.ajax({
7 *    url:"test.html",
8 *    global:false    //不触发全局ajax事件
9 * })
10 *
11 * **/
12
13 $(document).ajaxComplete(function(event, xhr, settings) {
ResponseHeader("sessionstatus")=="timeOut"){
ResponseHeader("loginPath")){
16            alert("登录过期,请重新登录...");
17            ResponseHeader("loginPath"));
18        }else{
19//alert("请求超时请重新登陆 !");
20        }
21    }
22 });

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。