在web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面,而重定向到登陆界面的功能。

项目是用springMVC+spring+hibernate实现 (和这个没有多大关系)

第一步

首先写一个登录权限过滤类--LoginFilter类实现Filter接口

 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里取用户
User user = (User) session.getAttribute("user"); // 登陆页面无需过滤
if("/biologyInfo/".equals(path) || "/biologyInfo/login/login1.htmls".equals(path)) {
chain.doFilter(servletRequest, servletResponse);
return;
} // 判断如果没有取到用户信息,说明这个请求是没有登录就在请求 就跳转到登陆页面
if (user == null) {
// 跳转到登陆页面
servletResponse.sendRedirect("/biologyInfo/login/login1.htmls");
} else {
// 已经登陆,继续此次请求
chain.doFilter(request, response);
} } @Override
public void destroy() {
// TODO Auto-generated method stub
} }

第二步:

在web.xml中配置一下filter

 <!-- 配置 登陆 过滤器 -->
<filter>
<filter-name>login</filter-name>
<filter-class>com.agen.util.LoginFilter</filter-class>
</filter> <filter-mapping>
<filter-name>login</filter-name>
<url-pattern>*.htmls</url-pattern><!--此处写/*代表浏览器地址栏中的所有请求都会被拦截 包括css文件和js文件 .htmls这是仅拦截以.htmls结尾的请求 -->
</filter-mapping>

这样这个过滤器就写成了。

说明:

1.在web.xml中配置的filter的 <url-pattern>参数中的值,意思就是拦截的请求路径,就是浏览器的地址栏中的URL,因为页面上不论是页面,还是js文件,还是css文件都是通过请求得到的。

2.而上面的web.xml中配置的 <url-pattern>*.htmls</url-pattern>表示拦截仅拦截.htmls结尾的URL,而将js或者css文件结尾的URL都放过。

3.而访问页面都是通过以下这样的请求去访问的页面,

http://192.168.16.104:8080/biologyInfo/login/geneinfo.htmls

http://192.168.16.104:8080/biologyInfo/login/welcome1.htmls

而这些都是先去找了后台的controller,从服务器才去的页面

贴出服务器端的代码:

 package com.agen.controller;

 import java.util.UUID;

 import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import com.agen.entity.User;
import com.agen.service.AuthorityService;
import com.agen.service.RoleService;
import com.agen.service.UserSevice;
import com.fasterxml.jackson.annotation.JsonCreator.Mode; @Controller()
@RequestMapping("login")
public class LoginController { @Resource(name="userSevice")
private UserSevice userService; @Resource(name="roleService")
private RoleService roleService; @Resource(name="authorityService")
private AuthorityService authorityService; @Autowired
private SessionFactory sessionFactory; public Session getCurrentSession() {
// 需要开启事物,才能得到CurrentSession getCurrentSession()是获取已有的 没有 就创建新的
return sessionFactory.getCurrentSession();
} @RequestMapping("/login1")
public String login(User user, Model model,HttpServletRequest request){
if(user.getUserName()==null &&user.getPassword()==null){
model.addAttribute("error", "0");
return "../../../index";
}else{
Criteria criteria = getCurrentSession().createCriteria(User.class);
criteria.add(Restrictions.eq("userName", user.getUserName()));
User user2 = userService.uniqueResult(criteria);
if(user2 == null) {
model.addAttribute("error", "1");
return "../../../index";
} else if(!( user2.getPassword() .equals(user.getPassword()) )){
model.addAttribute("error", "2");
return "../../../index";
}
Assert.notNull(user);
HttpSession session = request.getSession();
session.setAttribute("user", user);
return "/index/index";
} } @RequestMapping("/register")
@ResponseBody
public boolean register(User user){
boolean flag = false;
user.setUserId(UUID.randomUUID().toString());
Criteria criteria = getCurrentSession().createCriteria(User.class);
criteria.add(Restrictions.eq("userName", user.getUserName()));
User user2 = userService.uniqueResult(criteria);
if(user2 != null){
flag = false;
}else{
userService.save(user);
flag = true;
}
return flag;
} /**
* 页面二级菜单
* @return
*/
@RequestMapping("/welcome1")
public String welcome(){ return "/index/welcome";
}
@RequestMapping("/geneinfo")
public String geneinfo(){
return "/geneinfo/geneinfoone";
} }

【Filter 不登陆无法访问】web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面的功能的更多相关文章

  1. 在web项目中搭建一个spring mvc + spring + mybatis的环境

    介绍:本文中示范搭建一个ssm环境的框架:使用流程就是客户端通过http请求访问指定的接口,然后由服务器接受到请求处理完成后将结果返回. 本项目请求流程细节介绍:由客户端请求到指定的接口,这个接口是个 ...

  2. asp.net Web项目中使用Log4Net进行错误日志记录

      使用log4net可以很方便地为应用添加日志功能.应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能.同时,通过外部配置文件,用户可以不用重新编译程序就能 ...

  3. web 项目中a标签传值(中文)到后台的乱码问题

    web 项目中a标签传值(中文)到后台的乱码问题 jsp页面中的a标签: .............. <c:forEach items="${sellerList }" v ...

  4. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

  5. 转 web项目中的web.xml元素解析

    转 web项目中的web.xml元素解析 发表于1年前(2014-11-26 15:45)   阅读(497) | 评论(0) 16人收藏此文章, 我要收藏 赞0 上海源创会5月15日与你相约[玫瑰里 ...

  6. web项目中解决post乱码和get乱码的方法

    前提复习编码问题产生的原因: 1.  什么是URL编码. URL编码是一种浏览器用来打包表单输入的格式,浏览器从表单中获取所有的name和其对应的value,将他们以name/value编码方式作为U ...

  7. 在web项目中使用shiro(认证、授权)

    一.在web项目中实现认证 第一步,在web项目中导入shiro依赖的包 第二步,在web.xml中声明shiro拦截权限的过滤器 <filter> <filter-name> ...

  8. 在Java web项目中防止用户注销后使用浏览器中的“后退”按钮返回注销前页面

    一背景 公司安全整改, 要求:系统中对于关键业务操作应确保使用浏览器"后退"功能无法回到上一步操作界面. 提供:凭证提供所有被检查系统关键业务操作后回退视频,视频显示关键业务操作后 ...

  9. 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

    在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...

随机推荐

  1. JSP页面格式化货币金额,千分位

    <fmt:formatNumber value="${值}" pattern="currency"></fmt:formatNumber> ...

  2. 请确认 <Import> 声明中的路径正确,且磁盘上存在该文件。

    在网上下了个源码打开报错. 请确认 <Import> 声明中的路径正确,且磁盘上存在该文件. 一查,原来是路径错误. 解决办法:将项目文件(.csproj)用记事本打开,然后找到<I ...

  3. nyoj19_排列

    擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想 ...

  4. Xcode无法启动ios模拟器的问题

    一.问题描述 开发过程需要来回切换ios模拟器调试程序,开始在iPhone 4s下调试,然后切换到iPhone 6s Plus,再切换回iPhone 4s,遇到无法启动ios模拟器.错误提示如下: 二 ...

  5. CODE VS1008选数

    #include<cstdlib> #include<cstdio> #include<iostream> #include<cmath> #inclu ...

  6. Oracle 修改现有列的数据类型

    如果表中有数据,Oracle是不能修改其数据类型的.但可以通过新建一个临时列,将要修改列的数据复制到临时列中,删除原列再修改临时列的名字.这样说好像有点拗口,分步解说一下. 表AC_REG中有列:is ...

  7. spring mvc 重定向问题

    (1)我在后台一个controller跳转到另一个controller,为什么有这种需求呢,是这样的.我有一个列表页面,然后我会进行新增操作,新增在后台完成之后我要跳转到列表页面,不需要传递参数,列表 ...

  8. JS 保留两位小数问题收集

    1.使用四舍五入的方法,保留小数点后的两位小数: toFixed里面的参数表示保留的小数的位数,范围是0-20,超过20位就会报错了 <script> var num=22.127456; ...

  9. Python简易聊天工具-基于异步Socket通信

    继续学习Python中,最近看书<Python基础教程>中的虚拟茶话会项目,觉得很有意思,自己敲了一遍,受益匪浅,同时记录一下. 主要用到异步socket服务客户端和服务器模块asynco ...

  10. 网站上点击自定义按钮发起QQ聊天的解决方案

    一.背景 最近由于开发需要,需要在网站上自定义一个立即交谈的按钮,现将解决方式分享给大家. 二.解决方案 1.首先访问:http://shang.qq.com/widget/consult.php,适 ...