我在请求中有以下HTTP标头,我想从中提取JSESSIONID
它:
Accept=application/json
Accept-Encoding=gzip
deflate,Accept-Language=en-us
Connection=keep-alive
Content-Length=0
Content-Type=application/json
Cookie=JSESSIONID=ss0ox8w99o9142b73rssvc0r
Host=localhost:8080
User-Agent=NFA_QA/34 CFNetwork/720.5.7 Darwin/14.5.0 (x86_64)
Run Code Online (Sandbox Code Playgroud)
我使用ContainerRequestContext
如下:
@Override
public void filter(final ContainerRequestContext requestContext) throws IOException {
System.out.println("***HEADER VALUE**: " + requestContext.getHeaderString("Cookie"));
}
Run Code Online (Sandbox Code Playgroud)
获得结果:
JSESSIONID=zv71od6l2fd41hv6yf0980khy
Run Code Online (Sandbox Code Playgroud)
和:
@Override
public void filter(final ContainerRequestContext requestContext) throws IOException {
Map<String, javax.ws.rs.core.Cookie> clientCookie = requestContext.getCookies();
System.out.println("Client Cookie Map: " + clientCookie);
}
Run Code Online (Sandbox Code Playgroud)
获得结果:
Clinet Cookie Map: {JSESSIONID=JSESSIONID=1of1x5u1s1l4hdxfg2azlep42}
Run Code Online (Sandbox Code Playgroud)
JSESSIONID
从请求中提取的最佳方法是什么?
是否该方法getParameterMap
的HandshakeRequest
包括路径参数?我似乎找不到关于此的详细文档。
请不要为我编辑问题.我的问题是关于字符串操作,改变文本流很可能会改变问题的含义并引起混淆.
该问题可以视为字符串操作问题.但我希望杰克逊能够解决我的问题.
假设我收到了一个字符串{"payload":{"foo":"bar","ipsum":["lorem","lorem"]},"signature":"somehmacsign"}
.当它显示时,它就像:
{
"payload": {
"foo": "bar",
"ipsum": [
"lorem",
"lorem"
]
},
"signature": "somehmacsign"
}
Run Code Online (Sandbox Code Playgroud)
如何从第11个字符中提取其子字符串{
直到}
前一个字符串,"signature"
.即,{"foo":"bar","ipsum":["lorem","lorem"]}
.从语义上讲,我想提取字段的原始字符串表示payload
.我想它不应该涉及将JSON字符串解析为Java对象并返回String.我不想冒失去字段,间距或任何小功能的顺序的风险,因为它意味着HMAC签名.
编辑1:重新说明这个问题与Java String文字无关.
编辑2:虽然说起来可能有点早,但我的问题一般没有明显的现成解决方案(如何部分提取/解析JSON字符串).事实上,我自己发现我的懒惰/部分解析理论有点冗长.它需要太多的传递来定位深度嵌套的节点.
特别是对于我的情况,我发现在请求正文中附加签名是一个坏主意,因为它给接收方带来了困难.我正在考虑将签名移动到HTTP标头,也许X-Auth-Token
?
编辑3:事实证明,我的结论太早了.Cassio的答案通过使用自定义反序列化器和魔法完美地解决了这个问题skipChildren
!
我正在使用Jersey,Maven; 并且可以使用Jetty,Tomcat或J2EE Preview(可嵌入?).
大家好我是新来的休息和jax-rs所以我的问题是每个休息服务开始扩展该应用程序类和定义应用程序路径.现在我的问题是该应用程序类本身的生命周期是什么?这是一个例子:
import javax.ws.rs.core.Application;
@javax.ws.rs.ApplicationPath("resources")
public class ApplicationConfig extends Application {}
Run Code Online (Sandbox Code Playgroud)
这是一个servlet吗?它总是活着吗?我怎么理解这堂课?它是一个cdi豆?服务器是否在每个请求上创建此类?
我按照本教程使用Java EE设置websocket端点:
由于显而易见的原因有一些关于安全性(需要做更多的工作,例如,无SSL和访问限制/认证)。
所以我的目标是通过改善的WebSocket安全
我的问题:如何验证在ServerEndpoint在LoginBean中创建的令牌?
奖励问题:我是否错过了在Java EE中保护Websocket的一些重要部分?
这是我到目前为止的内容:
服务器端点
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/user/endpoint/{token}")
public class ThisIsTheSecuredEndpoint {
@OnOpen
public void onOpen(@PathParam("token") String incomingToken,
Session session) throws IOException {
//How can i check if the token is valid?
}
}
Run Code Online (Sandbox Code Playgroud)
LoginBean
@ManagedBean
@SessionScoped
public class LoginBean {
public String login() {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest)facesContext.getExternalContext().getRequest();
try {
request.login("userID", "password");
HttpSession session = request.getSession();
// here …
Run Code Online (Sandbox Code Playgroud) 如果我的回答如下:
{
"values": [ "1", "2" ]
}
Run Code Online (Sandbox Code Playgroud)
我应该如何使用readEntity
来填充List<String>
的价值观:1
,2
?
下面的操作只检索请求中的所有书籍。这显然是一个GET操作。
从你的角度来看,做下面这两个更好(赞成/反对):
获取 - api/library/2/books/
从图书馆 2 中检索所有书籍。
GET - api/library/2/books/3/5/10/33/...../pages
POST - api/library/2/books/pages
身体:
{
"books_id": [
2,
30,
40,
20,
30
]
}
Run Code Online (Sandbox Code Playgroud)
我真的很怀疑使用POST或GET方法来实现它。如果要检索 100-200 本书,URL 上的书籍 ID 会变得非常混乱。我想在这里得到一些启示。
我正在使用 PHP 来处理 Rest 应用程序,上面的所有这些方法都是有效的。
我有一个相对的url字符串,知道主机和协议.如何构建绝对url字符串?
好像很容易?是的,一开始看,但直到逃脱的角色来.我必须从302代码http(s)响应位置标头构建绝对URL.
让我们考虑一个例子
protocol: http
host: example.com
location: /path/path?param1=param1Data¶m2= "
Run Code Online (Sandbox Code Playgroud)
首先,我尝试构建url字符串,如:
Sting urlString = protocol+host+location
Run Code Online (Sandbox Code Playgroud)
URL类的构造函数不会转义空格和双引号:
new URL(urlString)
Run Code Online (Sandbox Code Playgroud)
URI类的构造函数失败,但异常:
new URI(urlString)
Run Code Online (Sandbox Code Playgroud)
URI.resolve
方法也失败,异常
然后我发现URI可以在查询字符串中转义params,但只有很少的构造函数,例如:
URI uri = new URI("http", "example.com",
"/path/path", "param1=param1Data¶m2= \"", null);
Run Code Online (Sandbox Code Playgroud)
这个构造函数需要路径和查询是一个单独的参数,但我有一个相对的URL,它不会被路径和查询部分拆分.
我可以考虑检查相对URL是否包含"?" 问题标志,并认为它之前的一切都是路径,并且它之后的一切都是查询,但如果相对网址不包含路径,但只查询,并且查询包含"?",该怎么办?标志?然后这将无效,因为部分查询将被视为路径.
现在我无法从相对URL建立绝对URL.
这些接受的答案似乎错了:
考虑到相对于url与主机和某个路径部分相关的url时的情况可能会很好:
最初的网址http://example.com/...some路径...相对/home?...query here ...
获得java核心解决方案会很棒,尽管它仍然可以使用一个好的lib.
我创建了一个自定义ExceptionMapper
,每次 API 中发生异常时我都会调用该自定义,以将其映射到合适的响应。以下是我的自定义异常类:
@Provider
public class ServiceExceptionMapper implements ExceptionMapper<Throwable> {
private Logger logging = LoggerFactory.getLogger(getClass());
@Override
public Response toResponse(Throwable throwable) {
log.error("There is an exception: ", throwable);
if (throwable instanceof IllegalArgumentException) {
return Response.status(Response.Status.BAD_REQUEST).entity(throwable.getMessage()).type (MediaType.TEXT_PLAIN).build();
}
if (throwable instanceof WebApplicationException) {
WebApplicationException we = (WebApplicationException) throwable;
return we.getResponse();
}
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(throwable.getMessage()).type(MediaType.TEXT_PLAIN).build();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在我的资源类中,我有一个 try 和一个 catch 块。如果有异常,catch 块应该捕获它并调用自定义异常映射器类。抛出异常的常用方法如下:
catch (Exception e) {
throw new WebApplicationException(Response.status(Status.INTERNAL_SERVER_ERROR).entity("Internal Server Error").build());
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试通过以下方式调用异常映射器类:
catch (Exception e) {
exceptionMapper.toResponse(e);
}
Run Code Online (Sandbox Code Playgroud)
exceptionMapper
类的字段在哪里 …
java ×7
jax-rs ×4
rest ×4
http ×2
java-ee ×2
json ×2
websocket ×2
api-design ×1
executable ×1
jackson ×1
jakarta-ee ×1
jersey ×1
security ×1
url ×1