如何向springmvc filter注入中注入service

&&完spring mvc项目中通过注解方式实现filter过滤器注入,如何对用户进行权限验证?各位牛牛,新人遇到个问题,求解。使用springmvc,注解方式,现在要在servlet之前使用filter进行权限验证。验证方式为根据传入的用户编号到数据库中查询是否有相应的记录,有则通过,无则拒绝。但是根据加载的顺序,在filter的时候spring的bean还没有加载,不知道怎么样才能访问到数据库。大家能不能帮忙指导一下这种东西怎么做?在此先谢谢了。1个牛币所有回答列表(6)如果要求不高,时间紧迫,使用interceptor,如果时间多,使用shiro或spring&security最佳答案apache shiro 你值得拥有谢谢二位,新人新大了。我现在用的ApplicationContext,但是还是有问题,访问数据库时报空指针错误,估计后面还要转到二位推荐的方法上去。访问数据库把访问数据库把可以用aop的方式,写一个切面用来验证等等等等等等完完等等完等最热搜索问答话题编程语言基础Web开发数据库开发客户端开发脚本工具游戏开发服务器软硬件开源组件类库相关问答等等等完等完等等完完等完最近浏览暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友Posts - 520,
Articles - 0,
Comments - 3
15:09 by myjava2, ... 阅读,
安全过滤器链
Spring Security的web架构是完全基于标准的servlet过滤器的。 它没有在内部使用servlet或任何其他基于servlet的框架(比如spring mvc), 所以它没有与任何特定的web技术强行关联。 它只管处理HttpServletRequest 和HttpServletResponse,不关心请求时来自浏览器,web服务客户端,HttpInvoker还是一个AJAX应用。
Spring Security维护了一个过滤器链,每个过滤器拥有特定的功能,过滤器需要服务也会对应添加和删除。 过滤器的次序是非常重要的,它们之间都有依赖关系。 如果你已经使用了,过滤器会自动帮你配置, 你不需要定义任何Spring Bean,但是有时候你需要完全控制Spring过滤器链, 因为你使用了命名空间没有提供的特性,或者你需要使用你自己自定义的类。
1.&DelegatingFilterProxy
当使用servlet过滤器时,你很需要在你的web.xml中声明它们, 它们可能被servlet容器忽略。在Spring Security,过滤器类也是定义在xml中的spring bean, 因此可以获得Spring的依赖注入机制和生命周期接口。 spring的DelegatingFilterProxy提供了在 web.xml和application context之间的联系。
当使用DelegatingFilterProxy,你会看到像 web.xml文件中的这样内容:
&filter-name&myFilter&/filter-name&
&filter-class&org.springframework.web.filter.DelegatingFilterProxy&/filter-class&
&filter-mapping&
&filter-name&myFilter&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
注意这个过滤器其实是一个DelegatingFilterProxy,这个过滤器里没有实现过滤器的任何逻辑。 DelegatingFilterProxy做的事情是代理Filter的方法,从application context里获得bean。 这让bean可以获得spring web application context的生命周期支持,使配置较为轻便。 bean必须实现javax.servlet.Filter接口,它必须和filter-name里定义的名称是一样的。查看DelegatingFilterProxy的javadoc获得更多信息。
2.&FilterChainProxy
现在应该清楚了,你可以声明每个Spring Security过滤器bean,你在application context中需要的。 把一个DelegatingFilterProxy入口添加到web.xml, 确认它们的次序是正确的。 这是一种繁琐的方式,会让web.xml显得十分杂乱,如果我们配置了太多过滤器的话。 我们最好添加一个单独的入口,在web.xml中,然后在application context中处理实体, 管理我们的web安全bean。 这就是FilterChainProxy所做的事情。它使用DelegatingFilterProxy (就像上面例子中那样),但是对应的class是org.springframework.security.web.FilterChainProxy。 过滤器链是在application context中声明的。这里有一个例子:
&bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy"&
&sec:filter-chain-map path-type="ant"&
&sec:filter-chain pattern="/webServices/**" filters="
securityContextPersistenceFilterWithASCFalse,
basicAuthenticationFilter,
exceptionTranslationFilter,
filterSecurityInterceptor" /&
&sec:filter-chain pattern="/**" filters="
securityContextPersistenceFilterWithASCFalse,
formLoginFilter,
exceptionTranslationFilter,
filterSecurityInterceptor" /&
&/sec:filter-chain-map&
你可能注意到FilterSecurityInterceptor声明的不同方式。 命名空间元素filter-chain-map被用来设置安全过滤器链。 它映射一个特定的URL模式,到过滤器链中,从bean名称来定义的filters元素。 它同时支持正则表达式和ant路径,并且只使用第一个出现的匹配URI。 在运行阶段FilterChainProxy会定位当前web请求匹配的第一个URI模式,由filters属性指定的过滤器bean列表将开始处理请求。 过滤器会按照定义的顺序依次执行,所以你可以对处理特定URL的过滤器链进行完全的控制。
你可能注意到了,我们在过滤器链里声明了两个SecurityContextPersistenceFilter(ASC是allowSessionCreation的简写,是SecurityContextPersistenceFilter的一个属性)。 因为web服务从来不会在请求里带上jsessionid,为每个用户代理都创建一个HttpSession完全是一种浪费。 如果你需要构建一个高等级最高可扩展性的系统,我们推荐你使用上面的配置方法。 对于小一点儿的项目,使用一个HttpSessionContextIntegrationFilter(让它的allowSessionCreation默认为true)就足够了。
在有关声明周期的问题上,如果这些方法被FilterChainProxy自己调用,FilterChainProxy会始终根据下一层的Filter代理init(FilterConfig)和destroy()方法。 这时,FilterChainProxy会保证初始化和销毁操作只会在Filter上调用一次, 而不管它在过滤器链中被声明了多少次)。你控制着所有的抉择,比如这些方法是否被调用 或targetFilterLifecycle初始化参数DelegatingFilterProxy。 默认情况下,这个参数是false,servlet容器生命周期调用不会传播到 DelegatingFilterProxy。
当我们了解如何使用命名控制配置构建web安全。 我们使用一个DelegatingFilterProxy,它的名字是&springSecurityFilterChain&。 你应该现在可以看到FilterChainProxy的名字,它是由命名空间创建的。
2.1.&绕过过滤器链
通过命名空间,你可以使用filters = "none",来提供一个过滤器bean列表。 这会朝向请求模式,使用安全过滤器链整体。注意任何匹配这个模式的路径不会有任何授权或校验的服务 起作用,它们是可以自由访问的。
3.&过滤器顺序
定义在web.xml里的过滤器的顺序是非常重要的。 不论你实际使用的是哪个过滤器,&filter-mapping&的顺序应该像下面这样:
ChannelProcessingFilter,因为它可能需要重定向到其他协议。
ConcurrentSessionFilter,因为它不使用SecurityContextHolder功能,但是需要更新 SessionRegistry 来从主体中放映正在进行的请求。
SecurityContextPersistenceFilter,这样 SecurityContext可以在web请求的开始阶段通过 SecurityContextHolder建立,然后 SecurityContext的任何修改都会在web请求结束的时候(为下一个web请求做准备)复制到 HttpSession中。
验证执行机制 - UsernamePasswordAuthenticationFilter, CasAuthenticationFilter, BasicAuthenticationFilter 等等 - 这样 SecurityContextHolder 可以被修改,并包含一个合法的 Authentication 请求标志。
SecurityContextHolderAwareRequestFilter,如果,你使用它,把一个Spring Security提醒HttpServletRequestWrapper安装到你的servlet容器里。
RememberMeAuthenticationFilter,这样如果之前的验证执行机制没有更新 SecurityContextHolder,这个请求提供了一个可以使用的remember-me服务的cookie,一个对应的已保存的 Authentication对象会被创建出来。
AnonymousAuthenticationFilter,这样如果之前的验证执行机制没有更新 SecurityContextHolder,会创建一个匿名 Authentication对象。
ExceptionTranslationFilter,用来捕捉 Spring Security异常,这样,可能返回一个HTTP错误响应,或者执行一个对应的 AuthenticationEntryPoint。
FilterSecurityInterceptor,保护web URI。
4.&使用其他过滤器 && 基于框架
如果你在使用SiteMesh,确认Spring Security过滤器在SiteMesh过滤器之前调用。 这可以保证SecurityContextHolder为每个SiteMesh渲染器及时创建。
5.&其他配置例子
方法一: web.xml配置一个&&& &filter&&&&&&&& &filter-name&DelegatingFilterProxy&/filter-name&&&&&&&& &filter-class&org.springframework.web.filter.DelegatingFilterProxy&/filter-class&&&&&&&& &init-param&&&&&&&&&&&& &param-name&targetBeanName&/param-name&&&&&&&&&&&& &param-value&myFilter&/param-value&&&&&&&&& //自己过滤器的名字&&&&&&& &/init-param&&&&&&&& &init-param&&&&&&&&&&&& &param-name&targetFilterLifecycle&/param-name&&&&&&&&&&&& &param-value&true&/param-value&&&&&&&& &/init-param&&&& &/filter&
&&& &filter-mapping&&&&&&&& &filter-name&DelegatingFilterProxy&/filter-name&&&&&&&& &url-pattern&/*&/url-pattern&&&& &/filter-mapping&方法二:web.xml配置一个&&& &filter&&&&&&&& &filter-name&myFilter&/filter-name&&&&&&&& &filter-class&org.springframework.web.filter.DelegatingFilterProxy&/filter-class&&&&&&&& &init-param&&&&&&&&&&&& &param-name&targetFilterLifecycle&/param-name&&&&&&&&&&&& &param-value&true&/param-value&&&&&&&& &/init-param&&&& &/filter&
&&& &filter-mapping&&&&&&&& &filter-name&myFilter&/filter-name&&&&&&&& &url-pattern&/*&/url-pattern&&&& &/filter-mapping&
方法一或者二不同的地方就是在web.xml中的写法不同而已没有太大的区别,配完web.xml之后还要配置applicationContext.xml中的bean。applicationContext.xml配置: &bean id="myFilter" class="com.bjtu.filter"& //指名具体的filter类&&& &property name="service"&&&&&&&&&&&&&&&&&&&& //需要注入的具体参数 &&&&&&& &ref bean="service"/& &&& &/property& &/bean& &bean id="service" parent="baseTransactionProxy"&//这里的service封装了所有对数据库的操作&&&&&&& &property name="target"&&&&&&&&&&&& &bean class="com.maimaiche.service.MaiMaiCheServiceImpl"&&&&&&&&&&&&& ......&&&&&&&&&&&& &/bean&&&&&&& &/property&&/bean&4366人阅读
servlet and jsp(11)
spring(2)
listener中需要使用service方法怎么办?
解决方法:
1、用qurartz的一次性任务的实现方式
2、 也可以用下面的方式来获取applicationContext,然后自己加载bean。
3、 还可以自己解析配置文件,单独生成一个context,但这样浪费太大,不建议这样做。
下面贴上第二种方法的实现代码
在listener中
public class XXStartUpListener extends ContextLoaderListener
&& &@Override
&& &public void contextInitialized(ServletContextEvent event)
&& &&& &ServletContext servletContext=event.getServletContext();
&& &&& &ApplicationContext ctx=WebApplicationContextUtils.getWebApplicationContext(servletContext);
&& &&& &DcTimerService dcTimerService=(DcTimerService)ctx.getBean(&dcTimerService&);
&& &&& &QuartzManager quartzManager=(QuartzManager)ctx.getBean(&quartzManager&);
&& &&& &List&CustomJob& jobList=dcTimerService.findAll();
&& &&& &for (CustomJob customJob : jobList)
&& &&& &&& &if(&STARTED&.equals(customJob.getStrStatus()))
&& &&& &&& &{
&& &&& &&& &&& &
&& &&& &&& &}
&& &&& &&& &System.out.println(&xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&);
在filter或者jsp、servlet中类似,
使用HttpServletRequest获取SerlvetContext的方法是:request.getSession().getServletContext();
------------------------------------------------------------------------------------------------
另外扩展一下,spring定义的或者注解的各个bean,如何在普通类(没有被spring管理的类,比如自己new一个)中获取呢?
在spring中有一个org.springframework.context.ApplicationContextAware,只要继承并实现这个接口即可使用spring的全局context。
使用这个的前提是spring已经初始化完毕,所以在listener中还不能使用这个方法。
需要两个步骤:
1、实现这个接口
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class GlobalContext implements ApplicationContextAware {
private static ApplicationContext context;
public void setApplicationContext(ApplicationContext contex)
throws BeansException {
context = contex;
public static ApplicationContext getContext() {
return context;
public final static Object getBean(String beanName) {
return context.getBean(beanName);
public final static Object getBean(String beanName, Class&?& requiredType) {
return context.getBean(beanName, requiredType);
2、把实现该接口的类,配置到spring的配置文件(application-all.xml)中。
&?xml version=&1.0& encoding=&UTF-8&?&
&!DOCTYPE beans PUBLIC &-//SPRING//DTD BEAN//EN& &http://www.springframework.org/dtd/spring-beans.dtd&&
&!-- getGlobalContext --&
class=&com.netease.extration.util.GlobalContext&
这样就可以在任何地方使用globalcontext来获取spring定义的bean了
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:336038次
积分:4665
积分:4665
排名:第4680名
原创:133篇
转载:47篇
评论:39条
(1)(1)(3)(1)(1)(2)(1)(4)(1)(1)(1)(3)(2)(1)(5)(2)(1)(1)(1)(1)(1)(5)(1)(1)(1)(5)(8)(3)(7)(3)(1)(5)(5)(4)(1)(5)(6)(1)(3)(1)(9)(4)(4)(28)(3)(15)(13)(4)}

我要回帖

更多关于 filter 注入bean 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信