场景

  一般javaweb网站都有用户登录,而有一些操作必须用户登录才能进行,常见流程:用户请求--》后台判断是否登录--》没登录跳转到登录界面,登录用户正常操作

解决思路

  在用过滤器过滤请求,判断是否登录,如果未登录,返回参数跳转的登录界面,登录了的请求放行

具体实现

  •   新建一个web工,参考:【Maven】Eclipse 使用Maven创建Java Web项目
  •   新建一个LoginFilter过滤器类,继承Filter类
     package com.test.login;
    
     import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    import java.util.List; 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; public class LoginFilter implements Filter { public static List<String> pattenURL = new ArrayList<String>(); @Override
    public void destroy() {
    // TODO Auto-generated method stub } @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;
    HttpSession session = httpRequest.getSession();
    // 登陆url
    String loginUrl = httpRequest.getContextPath() + "/login.jsp";
    String url = httpRequest.getRequestURI().toString(); // 注:在pattenURL中的全部不拦截 url.indexOf(urlStr) > -1 表示urlStr在url中出现过,出现就不拦截
    for (String urlStr : pattenURL) {
    if (url.indexOf(urlStr) > -1) {
    chain.doFilter(request, response);
    return;
    }
    } //超时处理,ajax请求超时设置超时状态,页面请求超时则返回提示并重定向,session.getAttribute("")是获取到登录人的session信息
    if (session.getAttribute("") == null) {
    // 判断是否为ajax请求
    if (httpRequest.getHeader("x-requested-with") != null
    && httpRequest.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
    httpResponse.addHeader("sessionstatus", "timeOut"); // 返回超时标识
    httpResponse.addHeader("loginPath", loginUrl);// 返回url
    chain.doFilter(request, response);// 不可少,否则请求会出错
    } else {
    // alert('会话过期,请重新登录');
    String str = "<script language='javascript'>" + "window.top.location.href='" + loginUrl + "';</script>";
    response.setContentType("text/html;charset=UTF-8");// 解决中文乱码
    try {
    PrintWriter writer = response.getWriter();
    writer.write(str);
    writer.flush();
    writer.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    } else {
    chain.doFilter(request, response);
    }
    } /**
    * 过滤器初始化调用方法 在pattenURL中的全部不拦截,所以上面会使用:path.indexOf(urlStr) > -1
    */
    @Override
    public void init(FilterConfig config) throws ServletException {
    pattenURL.add("login.jsp");// 登录jsp
    pattenURL.add("login.do");// 登录方法
    pattenURL.add("css");// css
    pattenURL.add("image");// image
    pattenURL.add("js");// js
    pattenURL.add("fonts");// fonts } }
  •   在web.xml中注册过滤器
     <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name>test-login</display-name> <!-- 登录过滤器  -->
    <filter>
    <description>登录过滤器</description>
    <filter-name>loginFilter</filter-name>
    <filter-class>com.test.login.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>loginFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
      
    <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    </welcome-file-list> </web-app>
  •   引入一个全局的js。用户控制ajax请求,如果是ajax请求的话,跳转到登录界面。js代码主要是真对所有ajax请求进行跳转的,所以如果有的ajax不想被过滤拦截,则只需要写上:global:false即可不被拦截到
     /* 
     * 说明:此处是调用ajax方法时,判断session是否过期 
     *  
     * 注:如果不想让ajax方法受这个影响,可以在ajax方法中写: global:false 
     * 如下: 
     * $.ajax({ 
     *    url:"test.html", 
     *    global:false    //不触发全局ajax事件 
     * }) 
     *  
     * **/  
      
    $(document).ajaxComplete(function(event, xhr, settings) {   
        if(xhr.getResponseHeader("sessionstatus")=="timeOut"){   
            if(xhr.getResponseHeader("loginPath")){  
                alert("登录过期,请重新登录...");  
                window.location.replace(xhr.getResponseHeader("loginPath"));
            }else{   
                //alert("请求超时请重新登陆 !");   
            }   
        }   
    }); 

【Java】JavaWeb 登录检查及界面跳转的更多相关文章

  1. springMVC 拦截器如何做登录检查及页面跳转

    一个非常简单的登录权限拦截器 问题一:登录页面的提交请求肯定是要过滤掉的,目前采用在xml里配置<mvc:mapping path="/supplier/*"/>来过滤 ...

  2. Java Web登录界面

    非常激动的开通了我的第一个博客,在这里希望大家能多多指点,相互学习. 一个简单的登录界面 首先我们先把这个登录分为三块: 一.数据库 数据库我用的是MYSQL: 二.前端 三.后台 1.  后台代码的 ...

  3. java web登录界面 源代码

    大概流程: 在java web项目中 导入sqljdbc4的包 在java Resources中完成java代码 在webContent 下建立一个存放自己写jsp的文件夹 将sqljdbc4和jst ...

  4. java 自动登录代码

    javaBean的代码    package bean;    import java.io.Serializable;    public class Admin implements Serial ...

  5. angular利用ui-router登录检查

    angular利用ui-router登录检查 SAP都会有这个问题,session过期或者页面被刷新的情况下应该进入登录页. 监听ui-router的satte事件可以实现当state切换的时候检查登 ...

  6. java单点登录原理与简单实现

    一.单系统登录机制 1.http无状态协议 web应用采用browser/server架构,http作为通信协议.http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关 ...

  7. angular中的 登录检查 和 过期Session清理

    angular利用ui-router进行登录检查 SAP都会有这个问题,session过期或者页面被刷新的情况下应该进入登录页. 监听ui-router的satte事件可以实现当state切换的时候检 ...

  8. 【struts2】自定义登录检查拦截器

    在实际开发中,一个常见的功能要求是:有很多操作都需要登录后才能操作,如果操作的时候还没有登录,那么通常情况下会要求跳转回到登录页面. 1)如何实现这样的功能呢? 在具体实现之前,先来考虑几个问题: ( ...

  9. 界面跳转+信息传递+AS中如何将ADV转移到其他盘中

    今日所学:界面跳转 信息传递 遇到的问题: 昨天遇到不能新建java类,在网上百度了很多,大多原因是没有新建java类的模板,但是我有,换了一个新的新建的方式后,发现虽然能建立了,但在测试时还是不能页 ...

随机推荐

  1. Android设置ScrollView回到顶部的三种方式 (转)

    一.ScrollView.scrollTo(0,0)  直接置顶,瞬间回到顶部,没有滚动过程,其中Y值可以设置为大于0的值,使Scrollview停在指定位置; 二.ScrollView.fullSc ...

  2. linux 升级python2.7

    linux为centos6,系统默认安装了python2.6,需要执行的python脚本内容包含标准库之xml.etree.ElementTree  用到库里的一个iter方法是python2.7的新 ...

  3. Linux sudo用法与配置

    Linux环境:CentOS 6.7 结构说明 可以通过编辑文件/etc/sudoers来配置,通常使用visudo命令来进行修改,因为如果你修改的格式不符合它会进行提示.接下来就通过一个格式来了解它 ...

  4. 201. Bitwise AND of Numbers Range (Bit)

    Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND(按位与) of all nu ...

  5. 【资料整理】c#基础

    .net基础:.net与C# .net是一个平台 c#是一门语言 .net的用途a.桌面应用程序 b.网站应用程序 c.专业游戏开发(XBOX360) d.嵌入式设备软件开发 e.智能手机APP开发 ...

  6. jggrid应用,后台c#

    参考网址: 1.https://www.cnblogs.com/miro/p/jqGrid.html 2.https://blog.csdn.net/ainuser/article/details/6 ...

  7. 一个先进的App框架:使用Ionic创建一个简单的APP

    原文  http://www.w3cplus.com/mobile/building-simple-app-using-ionic-advanced-html5-mobile-app-framewor ...

  8. linux命令学习之:netstat

    Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Membershi ...

  9. mysql utf8mb4

    遇到的问题 有一个项目需要存储 emoji 表情.另外极少数中文在存储的时候也遇到 utf8 编码格式的数据库在储存时报错. Rails creating schema_migrations - My ...

  10. python学习笔记-Day4(1)

    迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优点是 ...