spring boot 里面用拦截器好像比用过滤器多一些. 在过滤器中, 并不能获取到action的相关信息, 会造成很多的麻烦和功能欠缺.

那, 这里就用过滤器做一个小栗子, 实际使用过程中, 不会这么做的.

用过滤器做一个不完善的登录权限判断.

一. 过滤器

package org.elvin.springboot.filter;

import org.thymeleaf.util.StringUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException; public class LoginFilter implements Filter { private String passUrl; private String loginUrl; //region getter / setter
public String getPassUrl() {
return passUrl;
} public void setPassUrl(String passUrl) {
this.passUrl = passUrl;
} public String getLoginUrl() {
return loginUrl;
} public void setLoginUrl(String loginUrl) {
this.loginUrl = loginUrl;
}
//endregion @Override
public void init(FilterConfig filterConfig) throws ServletException { } @Override
public void destroy() { } @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response; if(isPassUrl(req)){
filterChain.doFilter(req, resp);
return;
} HttpSession session = req.getSession();
String token = (String)session.getAttribute("token");
if(StringUtils.isEmpty(token)){
resp.sendRedirect(req.getContextPath() + loginUrl);
return ;
} filterChain.doFilter(req, resp);
} /**
* 判断是否不需要权限
* @param req
* @return
*/
public boolean isPassUrl(HttpServletRequest req){
String requestURI = req.getRequestURI() + ";";
String contextPath = req.getContextPath();
if(!requestURI.startsWith(contextPath)){
return false;
}
requestURI = requestURI.substring(contextPath.length());
if(0 <= passUrl.indexOf(requestURI)){
return true;
}
return false;
}
}

在这里栗子里, 应该在过滤器里面加个文件请求过滤. 不过, 好像没有影响到结果, 所以, 懒得处理了, 后面拦截器的时候, 会再实现一遍这个功能.

二. 拦截器的java配置文件

package org.elvin.springboot.config;

import org.elvin.springboot.filter.LoginFilter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import javax.servlet.Filter; @Configuration
public class LoginConfig { @Value("${passUrl}")
private String passUrl; @Value("${loginUrl}")
private String loginUrl; @Bean(name="loginFilter")
public Filter loginFilter(){
LoginFilter filter = new LoginFilter();
filter.setPassUrl(passUrl);
filter.setLoginUrl(loginUrl);
return filter;
} @Bean
public FilterRegistrationBean registrationBean(){
FilterRegistrationBean reg = new FilterRegistrationBean();
reg.setFilter(loginFilter());
reg.addUrlPatterns("/*");
reg.setName("loginFilter");
reg.setOrder(Integer.MAX_VALUE);
return reg;
} }

这里面没有写注释了, 看到方法名, 应该能看明白方法是干啥的.

三. yml配置文件

passUrl: /login/index;/login/checkOut;
loginUrl: /login/index

loginUrl 是登录页面地址, passUrl 是不需要登录的页面地址

到这里, 过滤器已经结束了. 接下来, 加入控制器和视图.

四. controller / view

package org.elvin.springboot.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; @Controller
@RequestMapping("login")
public class LoginController { @Autowired
private HttpServletRequest request; @GetMapping("index")
public String index(){
HttpSession session = request.getSession();
session.setAttribute("token", "token"); return "login/index";
} @PostMapping("checkOut")
@ResponseBody
public String checkOut(){
HttpSession session = request.getSession();
session.setAttribute("token", null);
return "success";
}
}

html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>index</title>
<link rel="stylesheet" th:href="@{/bootstrap/css/bootstrap.css}" />
</head>
<body>
<div class="container">
<input type="button" th:value="登出" id="checkout"/>
</div> <script th:src="@{/js/jquery-1.11.3.js}"></script>
<script th:src="@{/bootstrap/js/bootstrap.js}" ></script>
<script th:inline="javascript">
$(function(){
$(".container").delegate("#checkout", "click", function(){
$.ajax({
url: [[@{/login/checkOut}]],
type:'post',
data:'',
success: function(res){
if(res == "success"){
alert("登出成功!");
}
}
});
});
});
</script>
</body>
</html>

结果展示还真不好弄, 得弄成 动态图片, 额, 个人比较懒, 就算了.

spring boot 与 filter的更多相关文章

  1. Spring Boot实践——Filter实现

    Filter介绍 Filter是Servlet规范规定的,不属于spring框架,也是用于请求的拦截.但是它适合更粗粒度的拦截,在请求前后做一些编解码处理.日志记录等. 一个Filter包括:1).在 ...

  2. spring boot: 通过filter过滤器实现中文的简体繁体字符集转换(spring boot 2.3.1)

    一,为什么要使用filter来实现简繁体转换? 项目中有时会有同时支持简体和繁体两种字符集的要求, 或者搜索引擎有支持繁体输入字符的需求. 针对繁体字符的显示, 我们通常会在数据库和模板.文案配置中默 ...

  3. Spring Boot配置Filter

    此博客是学习Spring Boot过程中记录的,一来为了加深自己的理解,二来也希望这篇博客能帮到有需要的朋友.同时如果有错误,希望各位不吝指教 一.通过注入Bean的方式配置Filter: 注意:此方 ...

  4. Spring Boot 使用 Filter

    Filter 是 JavaEE 中 Servlet 规范的一个组件,位于包javax.servlet 中,它可以在 HTTP 请求到达 Servlet 之前,被一个或多个Filter处理. 1. 编写 ...

  5. Spring boot 注册Filter , Listener, Servlet

    1: ServletRegistrationBean   Servlet @Bean public ServletRegistrationBean myServlet(){ ServletRegist ...

  6. spring boot 捕获filter异常 统一返回处理结果

    如前面的文章所述,controller中抛出的异常我们使用ControllerAdvice来处理: @RestControllerAdvice @Slf4j public class GlobalEx ...

  7. Spring Boot的filter简单使用

    过滤器(Filter)的注册方法和 Servlet 一样,有两种方式:代码注册或者注解注册 1.代码注册方式 通过代码方式注入过滤器 @Bean     public FilterRegistrati ...

  8. Spring Boot 整合Filter

    两种方法 方法一: 正常创建好Filter类,配置完成 package clc.user.filter; import javax.servlet.Filter; import javax.servl ...

  9. Spring Boot 自定义Filter

    一.Filter功能 它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servle ...

随机推荐

  1. PAT甲级 1130. Infix Expression (25)

    1130. Infix Expression (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Give ...

  2. 怎样去写线程安全的代码(Java)

    使用多线程就可能会存在线程安全的问题.很多 java 程序员对写多线程都很挣扎,或者仅仅理解那些是线程安全的代码,那些不是.这篇文章我并不是详述线程安全,详述同步机制的文章,相反我只是用一个简单的非线 ...

  3. poj2828 线段树单点更新

    Buy Tickets Time Limit: 4000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java ...

  4. mssql借助链接服务器进行数据快速迁移

    在工作中,遇到了一个任务,需要将A数据库的数据迁移到B数据库,两个数据库的数据结构是一样的.B数据库已经在相当数量的数据了,故而不能通过复制数据库的方式来实现.  旧方法 在对数据迁移的时候,一开始使 ...

  5. C# Winform右下角弹窗方式

    [方法一] 第一步:winform项目创建完成后,添加一个窗口,命名为:Messages .(加上最开始的Form1,一共为两个窗口),双击主窗口进入后台代码 . 第二步:在Messages 窗口中添 ...

  6. WPF学习笔记(3):ListView根据内容自动调整列宽

    DataGrid中,只要不设置DataGrid的宽度和列宽度,或者将宽度设置为Auto,那么表格就会根据内容自动调整宽度,以显示所有内容.但如果是ListView,按以上方法设置,却达不到列宽自动调整 ...

  7. owa2013配置HTTPS

  8. AEAI WM v1.6.0 升级说明,开源工作管理系统

    1 升级说明 AEAI WM v1.6.0版是AEAI WM v1.5.0版工作管理系统的升级版本,本次升级的系统是基于AEAI DP 3.8.0_20170228进行打包部署的,对产品中的功能及BU ...

  9. Ubuntu18.04 - 实现鼠标右键新建文件功能!

    Ubuntu18.04安装完毕后,你会发现,如果在桌面或其它地方,像在Windows下鼠标右键,新建一个文件,那么真的不行,没有那个选项!这个功能其实非常有用,怎么实现呢?新建一个你要右键新建类型文件 ...

  10. Code Chef MINPOLY(计算几何+dp)

    题面 传送门 题解 我们枚举这个凸多边形\(y\)坐标最小的点\(p_i\),然后对于所有\(y\)坐标大于等于它的点极角排序 我们预处理出\(s_{j,k}\)表示三角形\(p_i,p_j,p_k\ ...