我被要求在我的asp.net Web应用程序中实现城堡动态代理,我正在阅读几篇文章,我从Castle Project和Code Project获得了关于asp.net web应用程序中的城堡动态代理....
这两篇文章都与创建拦截器有关,但是我无法理解为什么拦截器会与类一起使用....为什么我要拦截行为正常的类?
主题行基本上都说明了一切.我有一个静态方法,我想拦截,以便可以应用它周围的建议.我可以使用任何非静态方法,但我不确定如何允许拦截静态方法.
我正在使用Java EE 6和Jboss AS7.1并尝试使用拦截器绑定(来自jboss站点的示例).
我有一个InterceptorBinding注释:
@InterceptorBinding
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface GeoRestrictedEquipment {
}
Run Code Online (Sandbox Code Playgroud)
拦截器:
@GeoRestrictedEquipment
@Interceptor
public class GeoRestrictedEquipmentInterceptor {
@EJB EquipmentDao equipmenttDao;
@EJB SecurityService securityService;
@AroundInvoke
public Object checker(InvocationContext ctx) throws Exception {
Integer id = (Integer) ctx.getParameters()[0];
Equipment equipment = equipmenttDao.findById(id);
GeoChecker.check(equipment.getSite(), securityService.getUser());
return ctx.proceed();
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个豆子:
@Stateless
@LocalBean
@SecurityDomain(Realm.NAME)
@RolesAllowed({ Roles.REGISTERED })
public class PumpService implements PumpServiceLocal {
@Override
@GeoRestrictedEquipment
public PumpInfos getPumpInfos(Integer pumpId) {
/* ... */
}
}
Run Code Online (Sandbox Code Playgroud)
但拦截器没有被调用......我从这个例子中错过了什么? …
在Spring-mvc拦截器中,我想访问处理程序控制器方法
public class CustomInterceptor implements HandlerInterceptor {
public boolean preHandle(
HttpServletRequest request,HttpServletResponse response,
Object handler) {
log.info(handler.getClass().getName()); //access to the controller class
//I want to have the controller method
...
return true;
}
...
}
Run Code Online (Sandbox Code Playgroud)
我已经找到 :
但它只能解决.我希望方法名称可以访问注释.
我正在尝试测试我的响应拦截器,但我很难搞清楚如何模拟$ window对象.这是我的拦截器代码:
'use strict';
angular.module('Domain.handlers')
.config(function($httpProvider) {
$httpProvider.responseInterceptors.push('UnauthorizedInterceptor');
})
.factory('UnauthorizedInterceptor', function($q, $injector, $window, ENV) {
return function(promise) {
var success = function(response) { return response; };
var error = function(response) {
if (response.status === 401) {
$window.location.href = ENV.account + '/oauth/authorize?client_id=' + ENV.clientId + '&redirect_uri=' + ENV.app + '/oauth/callback&response_type=token';
}
return $q.reject(response);
};
return promise.then(success, error);
};
});
Run Code Online (Sandbox Code Playgroud)
这是我的规格:
'use strict';
describe('Domain.handlers.response', function() {
var UnauthorizedInterceptor,
httpProvider,
$httpBackend,
$http,
token = '123456789';
beforeEach(module('Domain.handlers', function($httpProvider) {
httpProvider = $httpProvider;
}));
beforeEach(inject(function(_UnauthorizedInterceptor_, …Run Code Online (Sandbox Code Playgroud) Java中的拦截器和装饰器之间是否存在任何差异?严格来说,我可以使用装饰器实现一些拦截器无法实现的东西,反之亦然吗?
除了我必须检查方法名称以在拦截器中添加特定于方法的行为的问题:
拦截器:
@Nice
@Interceptor
public class NiceGreeterInterceptor {
@AroundInvoke
public Object decorate(InvocationContext ic) throws Exception {
Method method = ic.getMethod();
String methodName = method.getName();
Object result = ic.proceed();
if (methodName.equals("greet")) {
return "NEW " + result;
}
}
}
Run Code Online (Sandbox Code Playgroud)
装饰:
@Decorator
public class GreeterDecorator implements Greeter {
@Inject
@Any
@Delegate
private Greeter greeter;
@Override
public String greet() {
return "NEW " + greeter.greet();
}
}
Run Code Online (Sandbox Code Playgroud)
或者说我可以用拦截器重现装饰器的所有行为是合法的,但是使用装饰器会更舒服吗?
我想用拦截器排除一些服务.
app.module.js
providers: [
UserService,
RolesService,
{
provide: HTTP_INTERCEPTORS,
useClass: TokenInterceptor,
multi: true
},
],
Run Code Online (Sandbox Code Playgroud)
Login.service.ts
return this.httpClient.post(this.appUrl + '/oauth/token', body.toString(), { headers, observe: 'response' })
.map((res: Response) => {
const response = res.body;
this.storeToken(response);
return response;
})
.catch((error: any) => {
ErrorLogService.logError(error);
return Observable.throw(new Error(error.status));
});
}
Run Code Online (Sandbox Code Playgroud) 在这里我可以修改标题,因为有关于此功能的多个教程,但是:
@Injectable()
export class MyFirstInterceptor implements HttpInterceptor {
constructor(private currentUserService: CurrentUserService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
console.log(JSON.stringify(req));
const token: string = this.currentUserService.token;
if (token) {
req = req.clone({ headers: req.headers.set('Authorization', 'Bearer ' + token) });
}
if (!req.headers.has('Content-Type')) {
req = req.clone({ headers: req.headers.set('Content-Type', 'application/json') });
}
req = req.clone({ headers: req.headers.set('Accept', 'application/json') });
return next.handle(req);
}
}
Run Code Online (Sandbox Code Playgroud)
但在我的情况下,有一个令牌,我需要添加请求正文而不是请求标题,所以有任何方法来修改正文.
更新:Mild Fuzz的方法适用于简单的帖子请求,但我想添加查询,如果它是GET请求和正文,如果它允许添加正文.最重要的是,当我尝试发送表单数据时它就破了.
...request.body删除表单数据并将其转换为JSON对象,以便我的图像消失.
默认情况下,当 JavaScript 对象包含 Date 对象时,Axios 将其序列化为 UTC。这意味着传输的时间是使用时区进行转换的。这不适用于我的用例。我需要将没有时区转换的时间发送为 UTC。
我基于#1548实现了自定义序列化器,但没有效果。我已经验证配置正在被修改,但是当我查看请求负载时,日期仍然使用 UTC (2022-02-03T04:59:00.000Z)。
注意:我的逻辑比较复杂,我在下面的代码中使用 toLocalString() 来简化示例。
const a = axios.create()
a.interceptors.request.use((config) => {
config.paramsSerializer = (params) =>
qs.stringify(params, {
serializeDate: (date: Date) => date.toLocaleString(),
})
return config
})
Run Code Online (Sandbox Code Playgroud)
有人理解为什么我不能覆盖默认行为并使用我自己的日期格式吗?
环境axios版本0.21.1
有时候需要知道拦截Guice中方法调用的方法拦截器的顺序.一个简单的示例场景是使用guice-persist提供的@Transactional方法拦截器和自定义的@Retry方法拦截器.重试拦截器必须在事务拦截器之外运行,以确保重试不在同一事务中执行.
在Spring中,您可以使用拦截器的Ordered接口来确保在重试拦截器中执行事务拦截器.有没有办法在Guice中实现同样的目标?