我最近对拦截器概念感兴趣.我知道这个概念在许多库中使用,如NHibernate,Entity Framework等.但我对如何在ASP.NET MVC Web应用程序中使用此概念感兴趣.
在Mvc Web应用程序中使用它有用吗?
有没有使用拦截器的开源Asp.Net Mvc项目?
Asp.net Mvc已经支持一种带过滤器的控制器拦截器.最好使用过滤器而不是拦截器?
我们有拦截器,我们有自定义拦截器,我们可以在执行操作之前或之后执行我们想要执行的所有操作.
那么有什么需要使用Preparable接口并实现它的准备方法呢?
这是另一种选择还是有一些特定目标可以做到这一点?
我在尝试实现AJAX Spinner加载代码时出于不明原因获取此错误.
我不明白应该在哪里定义标题.我做了,console.log(config)但我可以看到headers: accept: text/html那里的价值.
以下是我的代码:
/**
* Spinner Service
*/
//Spinner Constants
diary.constant('START_REQUEST','START_REQUEST');
diary.constant('END_REQUEST','END_REQUEST');
//Register the interceptor service
diary.factory('ajaxInterceptor', ['$injector','START_REQUEST', 'END_REQUEST', function ($injector, START_REQUEST, END_REQUEST) {
var $http,
$rootScope,
myAjaxInterceptor = {
request: function (config) {
$http = $http || $injector.get('$http');
if ($http.pendingRequests.length < 1) {
console.log(config);
$rootScope = $rootScope || $injector.get('$rootScope');
$rootScope.$broadcast(START_REQUEST);
}
}
};
return myAjaxInterceptor;
}]);
diary.config(['$httpProvider', function ($httpProvider) {
$httpProvider.interceptors.push('ajaxInterceptor');
}]);
Run Code Online (Sandbox Code Playgroud) 我正在使用JBoss 7.1构建Java EE应用程序.
为了对用户操作进行全面审核,我计划使用Interceptor来记录我的bean方法的每次调用.
为此,我有以下招标:
@Inherited
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Logged {
}
Run Code Online (Sandbox Code Playgroud)
然后我定义我的拦截器类:
@Logged
@Interceptor
public class UserActionInterceptor implements Serializable {
private static final long serialVersionUID = 1L;
private Logger log = LoggerFactory.getLogger(UserActionInterceptor.class);
public UserActionInterceptor() {
}
@AroundInvoke
public Object logMethodEntry(InvocationContext invocationContext) throws Exception {
log.debug(invocationContext.getMethod().getName() + " invoked.");
return invocationContext.proceed();
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这工作正常.如果我使用这个拦截器绑定一个类,我会得到一些日志记录.但是,当我想要定位我的bean类时,它变得更加棘手.
如果我有一个@RequestScoped类型的bean并将其绑定到我的拦截器,它就可以工作.但是,如果我有一个@ViewScoped类型的bean,那么它不会.
我查了@ViewScoped的定义,发现:
@Retention(value=RUNTIME)
@Target(value=TYPE)
@Inherited
public @interface ViewScoped
Run Code Online (Sandbox Code Playgroud)
我觉得问题在于这个注释没有目标类型METHOD,它阻止我的拦截器拦截对类方法的调用.
以前有人有同样的问题吗?有人知道是否可以扩展bean的范围,以便可以截获其方法而不改变@ViewScoped的性质?
我正在使用springmvc为客户端创建restful api,我有一个用于检查accesstoken的拦截器.
public class AccessTokenInterceptor extends HandlerInterceptorAdapter
{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
if (handler instanceof HandlerMethod)
{
HandlerMethod handlerMethod = (HandlerMethod) handler;
Authorize authorizeRequired = handlerMethod.getMethodAnnotation(Authorize.class);
if (authorizeRequired != null)
{
String token = request.getHeader("accesstoken");
ValidateToken(token);
}
}
return true;
}
protected long ValidateToken(String token)
{
AccessToken accessToken = TokenImpl.GetAccessToken(token);
if (accessToken != null)
{
if (accessToken.getExpirationDate().compareTo(new Date()) > 0)
{
throw new TokenExpiredException();
}
return accessToken.getUserId();
}
else
{
throw new …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的请求中添加一个 Authorization 标头,作为我们切换环境时的临时解决方法。我试图在扩展 HandlerInterceptorAdapter 的拦截器中处理它。
我使用了这里创建的 MutableHttpServletRequest 类,以便能够将标头添加到请求中,但似乎没有任何方法可以实际修改拦截器中返回的请求。有任何想法吗?
编辑:或者我必须在过滤器中执行此操作吗?
我有一个 Spring-Boot 应用程序,它被打包为一个带有 tomcat 依赖项的战争(所以我有两个选项 - 使用打包的 .war 在通过 java -jar 命令启动后在嵌入式容器中运行,并且还可以运行一个独立的 servlet 容器)。
下面是我的 App 主类
package com.mycompany.edsa.dgv.proxysvc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.mycompany.edsa.dgv.proxysvc.interceptor.DGVProxySvcRequestInterceptor;
//import com.mycompany.edsa.dgv.proxysvc.config.ConfigExtension;
@SpringBootApplication
@ImportResource("classpath:dgv-proxy-svc-spring-ctx.xml")
//@Import(ConfigExtension.class)
public class DGVProxySvcAppMain extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(DGVProxySvcAppMain.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DGVProxySvcAppMain.class);
}
@Bean
public DGVProxySvcRequestInterceptor dgvProxySvcRequestInterceptor() {
DGVProxySvcRequestInterceptor dgvProxySvcReqInterceptor = new DGVProxySvcRequestInterceptor();
return dgvProxySvcReqInterceptor; …Run Code Online (Sandbox Code Playgroud) 第一个想法是使用 anHttpInterceptor但clone(...)方法的签名不包含该observe选项。除了定义{ observe: 'response' }为每个请求的选择,我没有看到另一种尚未...
那么,是否有(如果有的话)全局设置{ observe: 'response' }选项的方法,例如通过?HttpInterceptor
clone(update: {
headers?: HttpHeaders;
reportProgress?: boolean;
params?: HttpParams;
responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
withCredentials?: boolean;
body?: T | null;
method?: string;
url?: string;
setHeaders?: {
[name: string]: string | string[];
};
setParams?: {
[param: string]: string;
};
}): HttpRequest<T>;
Run Code Online (Sandbox Code Playgroud) 编辑:这个问题非常混乱,所以我基本上用相同的代码示例和相同的场景重写了它。
当从服务器响应发送 401 错误时,我试图.commit从拦截器到我的 vuex 存储:
import axios from 'axios';
import { store } from '../store/store';
export default function execute() {
axios.interceptors.request.use(function(config) {
const token = store.state.token;
if(token) {
config.headers.Authorization = `Bearer ${token}`;
//console.log(config);
return config;
} else {
return config;
}
}, function(err) {
return Promise.reject(err);
});
axios.interceptors.response.use((response) => {
return response;
}, (err) => {
console.log(err.response.status);
if(err.response.status === 401) {
this.$store.commit('logout');
}
console.log('err'); // this doesnt even console log
return Promise.reject(err);
});
}
Run Code Online (Sandbox Code Playgroud)
但它抛出错误
类型错误:无法读取未定义的属性“$store” …
我正在使用 Spring Boot 构建后端3.1.0-SNAPSHOT,它使用Spring Framework 6x.
拦截器:
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("preHandle");
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("afterCompletion");
}
}
Run Code Online (Sandbox Code Playgroud)
在之前的版本(Spring Boot 2)中,添加Interceptor的方式是:
@Configuration
public class AppConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor( new MyInterceptor());
}
}
Run Code Online (Sandbox Code Playgroud)
现在,添加此类配置类的正确方法是:
@Configuration
public class AppConfig {
// Not …Run Code Online (Sandbox Code Playgroud) interceptor ×10
java ×3
spring ×3
java-ee ×2
javascript ×2
spring-boot ×2
.net ×1
angular ×1
angularjs ×1
asp.net-mvc ×1
axios ×1
c# ×1
http ×1
http-headers ×1
jboss ×1
logging ×1
response ×1
spring-mvc ×1
struts2 ×1
vuex ×1