spring boot 与 filter
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的更多相关文章
- Spring Boot实践——Filter实现
Filter介绍 Filter是Servlet规范规定的,不属于spring框架,也是用于请求的拦截.但是它适合更粗粒度的拦截,在请求前后做一些编解码处理.日志记录等. 一个Filter包括:1).在 ...
- spring boot: 通过filter过滤器实现中文的简体繁体字符集转换(spring boot 2.3.1)
一,为什么要使用filter来实现简繁体转换? 项目中有时会有同时支持简体和繁体两种字符集的要求, 或者搜索引擎有支持繁体输入字符的需求. 针对繁体字符的显示, 我们通常会在数据库和模板.文案配置中默 ...
- Spring Boot配置Filter
此博客是学习Spring Boot过程中记录的,一来为了加深自己的理解,二来也希望这篇博客能帮到有需要的朋友.同时如果有错误,希望各位不吝指教 一.通过注入Bean的方式配置Filter: 注意:此方 ...
- Spring Boot 使用 Filter
Filter 是 JavaEE 中 Servlet 规范的一个组件,位于包javax.servlet 中,它可以在 HTTP 请求到达 Servlet 之前,被一个或多个Filter处理. 1. 编写 ...
- Spring boot 注册Filter , Listener, Servlet
1: ServletRegistrationBean Servlet @Bean public ServletRegistrationBean myServlet(){ ServletRegist ...
- spring boot 捕获filter异常 统一返回处理结果
如前面的文章所述,controller中抛出的异常我们使用ControllerAdvice来处理: @RestControllerAdvice @Slf4j public class GlobalEx ...
- Spring Boot的filter简单使用
过滤器(Filter)的注册方法和 Servlet 一样,有两种方式:代码注册或者注解注册 1.代码注册方式 通过代码方式注入过滤器 @Bean public FilterRegistrati ...
- Spring Boot 整合Filter
两种方法 方法一: 正常创建好Filter类,配置完成 package clc.user.filter; import javax.servlet.Filter; import javax.servl ...
- Spring Boot 自定义Filter
一.Filter功能 它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servle ...
随机推荐
- python(1)在windows8.1下搭建python27和python36环境
去Python官网下载需要的Python版本 https://www.python.org/ 我下载的是下面这两个版本: Python 2.7.13 Python 3.6.1 安装Python27时, ...
- C#-VS发布网站-准备待发布网站-摘
通过使用“发布网站”工具部署网站项目 准备网站源文件 在vs生成发布文件 配置IIS .NET Framework 4 其他版本 Visual Studio 2008 Visual Studio ...
- A Magic Lamp -- hdu -- 3183
http://acm.hdu.edu.cn/showproblem.php?pid=3183 A Magic Lamp Time Limit: 2000/1000 MS (Java/Others) ...
- Xcode常见快捷键
在项目工作中,你每天都要和这些视图互动,所有这些视图在Xode中都是必不可少的.所以接下来江哥将教你如何快速通过热键来配置你的工作空间. Command (⌘):用来导航,主要用来控制导航区域. Al ...
- hdu 4864 任务分配贪心
http://acm.hdu.edu.cn/showproblem.php?pid=4864 有n台机器,m个任务,每台机器有xi时间,yi等级,每个任务也有xj,yj,当一个任务可以被处理的条件是, ...
- python模块补充
一.模块补充 configparser 1.基本的读取配置文件 -read(filename) 直接读取ini文件内容 -sections() 得到所有的section,并以列表的形式返回 -opti ...
- unigui如何连接数据库
unigui如何连接数据库 UNIGUI既可以二层直连数据库,也可以通过中间件连接数据库. 这里只介绍UNIGUI二层直连数据库. 数据库连接控件.数据集控件都要拖放在MainModule窗体上.UN ...
- Button去除边框方法
<Button Content="Button" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey} ...
- Linux系统VIM编辑器管理(2)
VI/VIM模式概述 在 Linux 的世界中,绝大部分的配置文件都是以 ASCII 的纯文本形态存在,因此利用简单的文字编辑软件就能够修改设定了,与微软的 Windows 系统不同的是,如果你用惯了 ...
- dubbo实现原理之动态编译
Dubbo为了实现基于spi思想的扩展特性,特别是能够灵活添加额外功能,对于扩展或则策略选择的设配类能够动态生成.对于一些需求已知的类如Protocal,它们的设配类代码dubbo可以直接的提供,但是 ...