后台配置拦截器配置文件|hibernate 全局拦截器怎么配置

A. hibernate 全局拦截器怎么配置

对于日志和事件的记录在每个项目中都会用到,如果在每个manager层中触发时间记录的话,会比较难以扩展和维护,所以可配置的日志和事件记录在项目中会用到!首先在spring的配置文件中加入hibernate拦截器java代码 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="entityInterceptor"> <ref bean="myInterceptor"/> </property> </bean> <bean id="myInterceptor" class="com.creawor.cbsms.util.MyInterceptor" /> MyInterceptor拦截器为:Java代码 package com.creawor.cbsms.util; import java.io.Serializable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Iterator; import javacommon.util.ApplicationContextHolder; import org.hibernate.CallbackException; import org.hibernate.EntityMode; import org.hibernate.Interceptor; import org.hibernate.Transaction; import org.hibernate.type.Type; import com.creawor.cbsms.event.EventRecord; import com.creawor.cbsms.model.CbsChannel; import com.creawor.cbsms.model.CbsMessage; public class MyInterceptor implements Interceptor{ //删除时记录时间 public void onDelete(Object obj, Serializable arg1, Object[] arg2, String[] arg3, Type[] arg4) throws CallbackException { // TODO Auto-generated method stub String[] entitys = EventRecord.getDeleteEntitysFireEvent(); for (String entityName : entitys) { if (entityName.equals(obj.getClass().getSimpleName())) { getEventRecordMethod(entityName, obj,EventRecord.getDeleteInfo()); } } } //修改时记录事件 public boolean onFlushDirty(Object obj, Serializable id, Object[] currentState, Object[] previousState , String[] propertyNames, Type[] types){ String[] entitys = EventRecord.getUpdateEntitysFireEvent(); for (String entityName : entitys) { if (entityName.equals(obj.getClass().getSimpleName())) { getEventRecordMethod(entityName, obj, EventRecord.getUpdateInfo()); } } return false; } public String onPrepareStatement(String arg0) { // TODO Auto-generated method stub return arg0; } //保存时记录事件 public boolean onSave(Object obj, Serializable arg1, Object[] arg2, String[] arg3, Type[] arg4) throws CallbackException { // TODO Auto-generated method stub String[] entitys = EventRecord.getSaveEntitysFireEvent(); for (String entityName : entitys) { if (entityName.equals(obj.getClass().getSimpleName())) { getEventRecordMethod(entityName, obj,EventRecord.getSaveInfo()); } } return false; } //根据反射机制执行事件记录类中相应的函数 public void getEventRecordMethod(String entityName,Object obj,String info){ try { Class[] parameterTypes = {String.class,Class.forName(EventRecord.getPrefixPackageName()+entityName)}; Method method = EventRecord.class.getMethod(EventRecord.getPrefixMethodName()+entityName, parameterTypes); Object[] objs = {info, Class.forName(EventRecord.getPrefixPackageName()+entityName).cast(obj)}; method.invoke((EventRecord)ApplicationContextHolder.getBean("eventRecord"),objs); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } 事件记录类:Java代码 package com.creawor.cbsms.event; import java.sql.Timestamp; import javacommon.util.ApplicationContextHolder; import com.creawor.cbsms..CbsEventDao; import com.creawor.cbsms.model.CbsBsc; import com.creawor.cbsms.model.CbsBscCells; import com.creawor.cbsms.model.CbsChannel; import com.creawor.cbsms.model.CbsEvent; import com.creawor.cbsms.model.CbsUserRegister; import com.creawor.cbsms.service.CbsEventManager; import com.creawor.security.model.PermUser; public class EventRecord { // 保存时要记录事件的对象 private static String[] saveEntitysFireEvent = { "CbsBscCells", "CbsChannel", "CbsBsc" }; // 删除时要记录事件的对象 private static String[] deleteEntitysFireEvent = { "CbsBscCells", "CbsChannel", "CbsBsc" }; // 更新时要记录事件的对象 private static String[] updateEntitysFireEvent = { "CbsBscCells", "CbsChannel", "CbsBsc" }; // 包的前缀,反射得到类时使用 private static String prefixPackageName = "com.creawor.cbsms.model."; // 记录该次操作的登录用户名:EventRecord为session范围 private String userName; // 调用函数的前缀,反射执行函数时使用 private static String prefixMethodName = "recordFor"; // 执行save时,事件描述 private static String saveInfo = "创建"; // 执行delete时,事件描述 private static String deleteInfo = "删除"; // 执行update时,事件描述 private static String updateInfo = "修改"; private CbsEventManager cbsEventManager; // spring自动注入 public void setCbsEventManager(CbsEventManager cbsEventManager) { this.cbsEventManager = cbsEventManager; } public void recordForCbsChannel(String desc, CbsChannel channel) { StringBuffer eventDesc = new StringBuffer(desc); eventDesc.append("频道" + channel.getChannelName()).append("[").append( channel.getChannelNum()).append("]"); record(eventDesc.toString(), null); } public void recordForCbsBscCells(String desc, CbsBscCells cell) { StringBuffer eventDesc = new StringBuffer(desc); eventDesc.append("小区"+cell.getCellName()).append("[").append( cell.getCellId()).append("]"); record(eventDesc.toString(), null); } public void record(String eventDesc, String eventOrigin) { CbsEvent event = new CbsEvent(); event.setEventDesc(userName + " " + eventDesc); event.setEventOrigin(eventOrigin); event.setStartTime(new Timestamp(System.currentTimeMillis())); cbsEventManager.save(event); } public void setUserName(String userName) { this.userName = userName; } public static String[] getDeleteEntitysFireEvent() { return deleteEntitysFireEvent; } public static String[] getSaveEntitysFireEvent() { return saveEntitysFireEvent; } public static String[] getUpdateEntitysFireEvent() { return updateEntitysFireEvent; } public static String getPrefixPackageName() { return prefixPackageName; } public static void setPrefixPackageName(String prefixPackageName) { EventRecord.prefixPackageName = prefixPackageName; } public static String getPrefixMethodName() { return prefixMethodName; } public static String getDeleteInfo() { return deleteInfo; } public static String getSaveInfo() { return saveInfo; } public static String getUpdateInfo() { return updateInfo; } } 其中EventRecord 在spring中的配置为:Java代码 <bean id="eventRecord" class="com.creawor.cbsms.event.EventRecord" scope="session" autowire="byName"/> EventRecord 为session范围可以使字段userName记录每次登录人员的姓名具体在每次登录后从spring容器中得到EventRecord然后set其userName即可!最后一步要想让session范围生效还要在web.xml中添加配置:Java代码 <web-app> … <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> … </web-app> 这样如果想要记录一个业务bean增删改的操作只需在EventRecord中设置saveEntitysFireEvent,deleteEntitysFireEvent,updateEntitysFireEvent属性即可,同样也可使用配置文件配置,这样都可以使日志和事件的记录变得很简单!

B. 拦截器filter要配置在什么地方是不是在web.xml中配置

如果用到struts 可以配置在struts.xml 文件中像servlet拦截器 配置在web.xml中

C. springMVC中关于拦截器的两种配置有什么不同

你指的是aop:config和mvc:interceptors的区别吗看简单的讲他们的区别是:aop:config是针对类方法的拦截,适用于所有的java类方法的拦截,包括javase。只需要在applicationContext.xml里设置就行了。mvc:interceptors是针对web请求的拦截,与java.servlet.Filter很类似。通过设置需要拦截的url请求从而拦截请求方法。其他方面两者都差不多。

D. 在SpringBoot中如何配置基础拦截器

所有的开发之中拦截器一定是一个必须要使用的功能,利用拦截器可以更加有效的实现数据的验证处理,而且最为幸运的是在SpringBoot之中所使用的拦截器与Spring中的拦截器完全一样。

基础拦截器操作

拦截器是一种AOP操作实现,那么在AOP之中用户一定不需要去关注拦截器的存在,用户只需要按照自己已经习惯的处理方式进行代码的编写即可。

创建一个程序的控制器类:

package com.gwolf.controller;

import com.gwolf.util.controller.AbstractBaseController;

import com.gwolf.vo.Member;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.ResponseBody;

@Controller

public class MemberController extends AbstractBaseController{

@RequestMapping(value="/member_add_pre", method = RequestMethod.GET)

public String memberAddPre() {

return "member_add";

}

@RequestMapping(value="/member_add", method = RequestMethod.POST)

@ResponseBody

public Object memberAdd(Member member) {

return member;

}

}

E. 什么是拦截器,如何配置拦截器,如何使用拦截器

需在web.xml文件中配置<filter>标签,这个标签就是用作拦截器的,具体的配置如下:<filter> — 配置过滤器<filter-name>FirstFilter</filter-name>—为过滤器起一个名字<filter-class>com.itheima.filter.FirstFilter</filter-class>—过滤器类的全路径名<init-param>— 可选的 可以配置多个 过滤器的初始化参数可以在过滤器中通过FilterConfig对象来获取<param-name>name1</param-name><param-value>value1</param-value></init-param></filter><filter-mapping>— 配置过滤器的拦截路径 ,一个<Filter>可以配置多个<filter-mappint><filter-name>FirstFilter</filter-name>—为哪个过滤器进行配置<url-pattern>/*</url-pattern>— 拦截哪个路径 其中url-pattern的写法和学习Serlvet时的url-pattern的写法相同 这个url-pattern可以配置多个<servlet-name>Demo1Servlet</servlet-name>—拦截哪个名字的Servlet 可以配置多个<dispatcher>REQUEST</dispatcher>— 配置拦截哪种类型的对资源的访问,可选的值有REQUESTFORWARD INCLUDE ERROR,如果不配置默认只拦截REQUEST方式,如果具体配置了就拦截具体配置的方式的对资源的访问,此标签可以配置多个</filter-mapping>简单点说就是需要配置<filter>和<filter-mapper>标签,filter标签里<filter-name>、<filter-class>是必须要的,filtermapper中<filter-name>、<url-pattern>是必须要的,其他标签都是可选的

F. spring拦截器配置应该放在哪个文件夹

web.xml

G. MyBatis的拦截器配置如何整合到(Spring+SpringMvc+MyBatis)的配置文件中

我在我们工程里面是这么配置的,你可以参考一下:(文件名:mybatis-config.xml)

<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><settings><settingname="lazyLoadingEnabled"value="false"/></settings><typeAliases><!–实体别名–><!–vo别名–></typeAliases><!–分页插件–><plugins><plugininterceptor="com.cn.kvn.framework.jdbc.mybatisPageInterceptor.PageInterceptor"><propertyname="dialectClassName"value="com.cn.kvn.framework.jdbc.mybatisPageInterceptor.MySQLDialect"/></plugin></plugins><!–注意:配置拦截器的时候需要注意plugins的位置,plugins位置顺序如下:(否则会解析报错)–><!–"configuration"的内容必须匹配"(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,databaseIdProvider?,mappers?)–></configuration>

H. ssh2中如何配置拦截器

自定义拦截器作为“框架(framework)”,可扩展性是不可或缺的,因为世上没有放之四海而皆准的东西。虽然,Struts 2为我们提供如此丰富的拦截器实现,但是这并不意味我们失去创建自定义拦截器的能力,恰恰相反,在Struts 2自定义拦截器是相当容易的一件事。大家在开始着手创建自定义拦截器前,切记以下原则:拦截器必须是无状态的,不要使用在API提供的ActionInvocation之外的任何东西。 要求拦截器是无状态的原因是Struts 2不能保证为每一个请求或者action创建一个实例,所以如果拦截器带有状态,会引发并发问题。所有的Struts 2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。除此之外,大家可能更喜欢继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor。以下例子演示通过继承AbstractInterceptor,实现授权拦截器。首先,创建授权拦截器类tutorial.AuthorizationInterceptor,代码如下: package tutorial; import java.util.Map; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class AuthorizationInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation ai) throws Exception { Map session = ai.getInvocationContext().getSession(); String role = (String) session.get( " ROLE " ); if ( null != role) { Object o = ai.getAction(); if (o instanceof RoleAware) { RoleAware action = (RoleAware) o; action.setRole(role); } return ai.invoke(); } else { return Action.LOGIN; } } } 以上代码相当简单,我们通过检查session是否存在键为“ROLE”的字符串,判断用户是否登陆。如果用户已经登陆,将角色放到Action中,调用Action;否则,拦截直接返回Action.LOGIN字段。为了方便将角色放入Action,我定义了接口tutorial.RoleAware,代码如下: package tutorial; public interface RoleAware { void setRole(String role);} 接着,创建Action类tutorial.AuthorizatedAccess模拟访问受限资源,它作用就是通过实现RoleAware获取角色,并将其显示到ShowUser.jsp中,代码如下: package tutorial; import com.opensymphony.xwork2.ActionSupport; public class AuthorizatedAccess extends ActionSupport implements RoleAware { private String role; public void setRole(String role) { this .role = role; } public String getRole() { return role; } @Override public String execute() { return SUCCESS; } } 以下是ShowUser.jsp的代码:<% @ page contentType = " text/html; charset=UTF-8 " %> <% @taglib prefix = " s " uri = " /struts-tags " %> < html > < head > < title > Authorizated User </ title > </ head > < body > < h1 > Your role is: < s:property value ="role" /></ h1 > </ body > </ html > 然后,创建tutorial.Roles初始化角色列表,代码如下: package tutorial; import java.util.Hashtable; import java.util.Map;public class Roles { public Map < String, String > getRoles() { Map < String, String > roles = new Hashtable < String, String > ( 2 ); roles.put( " EMPLOYEE " , " Employee " ); roles.put( " MANAGER " , " Manager " ); return roles; } } 接下来,新建Login.jsp实例化tutorial.Roles,并将其roles属性赋予<s:radio>标志,代码如下:<% @ page contentType = " text/html; charset=UTF-8 " %> <% @taglib prefix = " s " uri = " /struts-tags " %> < html > < head > < title > Login </ title > </ head > < body > < h1 > Login </ h1 > Please select a role below: < s:bean id ="roles" name ="tutorial.Roles" /> < s:form action ="Login" > < s:radio list ="#roles.roles" value ="'EMPLOYEE'" name ="role" label ="Role" /> < s:submit /> </ s:form > </ body > </ html > 创建Action类tutorial.Login将role放到session中,并转到Action类tutorial.AuthorizatedAccess,代码如下: package tutorial; import java.util.Map; import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionSupport; public class Login extends ActionSupport implements SessionAware { private String role; private Map session; public String getRole() { return role; } public void setRole(String role) { this .role = role; } public void setSession(Map session) { this .session = session; } @Override public String execute() { session.put( " ROLE " , role); return SUCCESS; } } 最后,配置struts.xml文件,内容如下:<! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" > < struts > < include file ="struts-default.xml" /> < package name ="InterceptorDemo" extends ="struts-default" > < interceptors > < interceptor name ="auth" class ="tutorial.AuthorizationInterceptor" /> </ interceptors > < action name ="Timer" class ="tutorial.TimerInterceptorAction" > < interceptor-ref name ="timer" /> < result > /Timer.jsp </ result > </ action > < action name ="Login" class ="tutorial.Login" > < result type ="chain" > AuthorizatedAccess </ result > </ action > < action name ="AuthorizatedAccess" class ="tutorial.AuthorizatedAccess" > < interceptor-ref name ="auth" /> < result name ="login" > /Login.jsp </ result > < result name ="success" > /ShowRole.jsp </ result > </ action > </ package > </ struts > 发布运行应用程序,在浏览器地址栏中输入:http://localhost:8080/Struts2_Interceptor/AuthorizatedAccess.action。由于此时,session还没有键为“ROLE”的值,所以返回Login.jsp页面,如图2所示:图2 Login.jsp 选中Employee,点击Submit,出现图3所示页面:以上是从一个Struts2的文档上截取下来的,如何自定义拦截器,里面还有很多关于Struts的实用技巧,需要的话我可以把文档发给你。

I. spring mvc的静态资源拦截器怎么配置

初学者基本上使用1,2,3方案:

所有请求全部拦截,都在spring mvc 处理,静态资源如下配置

<mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/>

所有请求全部拦截,但是在web.xml中添加对静态资源的默认访问,如下

<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern></servlet-mapping>

所有请求全部拦截,在springmvc配置文件中添加如下,这种方式对spring版本必须要求3.0.5及以上。

<mvc:default-servlet-handler/>

然后是我极力推荐的一种,web.xml中配置DispatcherServlet的时候mapping如下配置,url-pattern不要全部拦截,把需要springmvc处理的请求添加自定义头。这种方法性能最好。

<servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/自定义</url-pattern></servlet-mapping>

J. 如何实现用户自定义拦截器以及拦截器的部署请详细写出步骤

需在web.xml文件中配置<filter>标签,这个标签就是用作拦截器的,具体的配置如下:<filter> — 配置过滤器<filter-name>FirstFilter</filter-name>—为过滤器起一个名字<filter-class>com.itheima.filter.FirstFilter</filter-class>—过滤器类的全路径名<init-param>— 可选的 可以配置多个 过滤器的初始化参数可以在过滤器中通过FilterConfig对象来获取<param-name>name1</param-name><param-value>value1</param-value></init-param></filter><filter-mapping>— 配置过滤器的拦截路径 ,一个<Filter>可以配置多个<filter-mappint><filter-name>FirstFilter</filter-name>—为哪个过滤器进行配置<url-pattern>/*</url-pattern>— 拦截哪个路径 其中url-pattern的写法和学习Serlvet时的url-pattern的写法相同 这个url-pattern可以配置多个<servlet-name>Demo1Servlet</servlet-name>—拦截哪个名字的Servlet 可以配置多个<dispatcher>REQUEST</dispatcher>— 配置拦截哪种类型的对资源的访问,可选的值有REQUESTFORWARD INCLUDE ERROR,如果不配置默认只拦截REQUEST方式,如果具体配置了就拦截具体配置的方式的对资源的访问,此标签可以配置多个</filter-mapping>简单点说就是需要配置<filter>和<filter-mapper>标签,filter标签里<filter-name>、<filter-class>是必须要的,filtermapper中<filter-name>、<url-pattern>是必须要的,其他标签都是可选的


赞 (0)