Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

useragent优化 #603

Merged
merged 3 commits into from
Feb 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

/**
Expand Down Expand Up @@ -79,7 +80,11 @@ static void properties(DynamicPropertyRegistry registry) {
@Order(2)
@Test
void testList() throws Exception {
mockMvc.perform(get("/user")).andDo(print()).andExpect(status().isOk());
mockMvc.perform(get("/user"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("[0].appId").value("appId"))
.andExpect(jsonPath("[0].version").value("version"));
}

@Order(3)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
package com.livk.browscap.webflux.controller;

import com.livk.context.useragent.annotation.UserAgentInfo;
import com.livk.context.useragent.domain.UserAgent;
import com.livk.context.useragent.UserAgent;
import com.livk.context.useragent.reactive.ReactiveUserAgentContextHolder;
import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
package com.livk.browscap.mvc.controller;

import com.livk.context.useragent.annotation.UserAgentInfo;
import com.livk.context.useragent.domain.UserAgent;
import com.livk.context.useragent.UserAgent;
import com.livk.context.useragent.servlet.UserAgentContextHolder;
import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
package com.livk.yauaa.webflux.controller;

import com.livk.context.useragent.annotation.UserAgentInfo;
import com.livk.context.useragent.domain.UserAgent;
import com.livk.context.useragent.UserAgent;
import com.livk.context.useragent.reactive.ReactiveUserAgentContextHolder;
import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
package com.livk.yauaa.webflux.controller;

import com.livk.context.useragent.annotation.UserAgentInfo;
import com.livk.context.useragent.domain.UserAgent;
import com.livk.context.useragent.UserAgent;
import com.livk.context.useragent.servlet.UserAgentContextHolder;
import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,13 @@

package com.livk.context.useragent;

import com.livk.context.useragent.domain.UserAgent;
import org.springframework.http.HttpHeaders;
import org.springframework.lang.NonNull;

import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;

/**
* The type Abstract user agent converter.
*
Expand All @@ -25,11 +28,17 @@
*/
public abstract class AbstractUserAgentConverter<T> implements UserAgentConverter {

private final Map<String, UserAgent> cache = new ConcurrentHashMap<>();

@Override
public UserAgent convert(@NonNull HttpHeaders headers) {
String useragent = headers.getFirst(HttpHeaders.USER_AGENT);
UserAgent.UserAgentBuilder builder = UserAgent.builder(useragent);
T t = create(headers);
String useragent = Optional.ofNullable(headers.getFirst(HttpHeaders.USER_AGENT)).orElse("");
return cache.computeIfAbsent(useragent, this::build);
}

protected UserAgent build(String useragent) {
DefaultUserAgent.UserAgentBuilder builder = DefaultUserAgent.builder(useragent);
T t = create(useragent);
return builder.browser(browser(t))
.browserType(browserType(t))
.browserVersion(browserVersion(t))
Expand All @@ -43,10 +52,10 @@ public UserAgent convert(@NonNull HttpHeaders headers) {

/**
* Create t.
* @param headers the headers
* @param useragent the useragent
* @return the t
*/
protected abstract T create(HttpHeaders headers);
protected abstract T create(String useragent);

/**
* Browser string.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,35 @@
/*
* Copyright 2021-2024 spring-boot-extension the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.livk.context.useragent.domain;
package com.livk.context.useragent;

/**
* The type User agent.
* <p>
* DefaultUserAgent
* </p>
*
* @author livk
*/
public record UserAgent(String userAgentStr, String browser, String browserType, String browserVersion, String os,
String osVersion, String deviceType, String deviceName, String deviceBrand) {
record DefaultUserAgent(String userAgentStr, String browser, String browserType, String browserVersion, String os,
String osVersion, String deviceType, String deviceName, String deviceBrand) implements UserAgent {

/**
* Builder user agent builder.
* @param userAgentStr the user agent str
* @return the user agent builder
*/
public static UserAgentBuilder builder(String userAgentStr) {
return new UserAgentBuilder(userAgentStr);
public static DefaultUserAgent.UserAgentBuilder builder(String userAgentStr) {
return new DefaultUserAgent.UserAgentBuilder(userAgentStr);
}

/**
Expand Down Expand Up @@ -69,7 +68,7 @@ public static class UserAgentBuilder {
* @param browser the browser
* @return the user agent builder
*/
public UserAgentBuilder browser(String browser) {
public DefaultUserAgent.UserAgentBuilder browser(String browser) {
this.browser = browser;
return this;
}
Expand All @@ -79,7 +78,7 @@ public UserAgentBuilder browser(String browser) {
* @param browserType the browser type
* @return the user agent builder
*/
public UserAgentBuilder browserType(String browserType) {
public DefaultUserAgent.UserAgentBuilder browserType(String browserType) {
this.browserType = browserType;
return this;
}
Expand All @@ -89,7 +88,7 @@ public UserAgentBuilder browserType(String browserType) {
* @param browserVersion the browser version
* @return the user agent builder
*/
public UserAgentBuilder browserVersion(String browserVersion) {
public DefaultUserAgent.UserAgentBuilder browserVersion(String browserVersion) {
this.browserVersion = browserVersion;
return this;
}
Expand All @@ -99,7 +98,7 @@ public UserAgentBuilder browserVersion(String browserVersion) {
* @param os the os
* @return the user agent builder
*/
public UserAgentBuilder os(String os) {
public DefaultUserAgent.UserAgentBuilder os(String os) {
this.os = os;
return this;
}
Expand All @@ -109,7 +108,7 @@ public UserAgentBuilder os(String os) {
* @param osVersion the os version
* @return the user agent builder
*/
public UserAgentBuilder osVersion(String osVersion) {
public DefaultUserAgent.UserAgentBuilder osVersion(String osVersion) {
this.osVersion = osVersion;
return this;
}
Expand All @@ -119,7 +118,7 @@ public UserAgentBuilder osVersion(String osVersion) {
* @param deviceType the device type
* @return the user agent builder
*/
public UserAgentBuilder deviceType(String deviceType) {
public DefaultUserAgent.UserAgentBuilder deviceType(String deviceType) {
this.deviceType = deviceType;
return this;
}
Expand All @@ -129,7 +128,7 @@ public UserAgentBuilder deviceType(String deviceType) {
* @param deviceName the device name
* @return the user agent builder
*/
public UserAgentBuilder deviceName(String deviceName) {
public DefaultUserAgent.UserAgentBuilder deviceName(String deviceName) {
this.deviceName = deviceName;
return this;
}
Expand All @@ -139,7 +138,7 @@ public UserAgentBuilder deviceName(String deviceName) {
* @param deviceBrand the device name
* @return the user agent builder
*/
public UserAgentBuilder deviceBrand(String deviceBrand) {
public DefaultUserAgent.UserAgentBuilder deviceBrand(String deviceBrand) {
this.deviceBrand = deviceBrand;
return this;
}
Expand All @@ -149,7 +148,7 @@ public UserAgentBuilder deviceBrand(String deviceBrand) {
* @return the user agent
*/
public UserAgent build() {
return new UserAgent(userAgentStr, browser, browserType, browserVersion, os, osVersion, deviceType,
return new DefaultUserAgent(userAgentStr, browser, browserType, browserVersion, os, osVersion, deviceType,
deviceName, deviceBrand);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Copyright 2021-2024 spring-boot-extension the original author or authors.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* https://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.livk.context.useragent;

/**
* @author livk
*/
public interface UserAgent {

String userAgentStr();

String browser();

String browserType();

String browserVersion();

String os();

String osVersion();

String deviceType();

String deviceName();

String deviceBrand();

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

package com.livk.context.useragent;

import com.livk.context.useragent.domain.UserAgent;
import org.springframework.http.HttpHeaders;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

package com.livk.context.useragent;

import com.livk.context.useragent.domain.UserAgent;
import lombok.Setter;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import com.blueconic.browscap.UserAgentParser;
import com.livk.context.useragent.AbstractUserAgentConverter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;

/**
* @author livk
Expand All @@ -32,9 +31,8 @@ public class BrowscapUserAgentConverter extends AbstractUserAgentConverter<Capab
private final UserAgentParser userAgentParser;

@Override
protected Capabilities create(HttpHeaders headers) {
String userAgent = headers.getFirst(HttpHeaders.USER_AGENT);
return userAgentParser.parse(userAgent);
protected Capabilities create(String useragent) {
return userAgentParser.parse(useragent);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

package com.livk.context.useragent.reactive;

import com.livk.context.useragent.domain.UserAgent;
import com.livk.context.useragent.UserAgent;
import reactor.core.publisher.Mono;
import reactor.util.context.Context;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

import com.livk.context.useragent.UserAgentHelper;
import com.livk.context.useragent.annotation.UserAgentInfo;
import com.livk.context.useragent.domain.UserAgent;
import com.livk.context.useragent.UserAgent;
import lombok.RequiredArgsConstructor;
import org.springframework.core.MethodParameter;
import org.springframework.core.ReactiveAdapter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

package com.livk.context.useragent.servlet;

import com.livk.context.useragent.domain.UserAgent;
import com.livk.context.useragent.UserAgent;
import org.springframework.core.NamedInheritableThreadLocal;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

import com.livk.commons.util.WebUtils;
import com.livk.context.useragent.UserAgentHelper;
import com.livk.context.useragent.domain.UserAgent;
import com.livk.context.useragent.UserAgent;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import com.livk.commons.util.WebUtils;
import com.livk.context.useragent.UserAgentHelper;
import com.livk.context.useragent.annotation.UserAgentInfo;
import com.livk.context.useragent.domain.UserAgent;
import com.livk.context.useragent.UserAgent;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.core.MethodParameter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,6 @@
import nl.basjes.parse.useragent.UserAgentAnalyzer;
import org.springframework.http.HttpHeaders;

import java.util.Map;
import java.util.stream.Collectors;

/**
* @author livk
*/
Expand All @@ -34,11 +31,8 @@ public class YauaaUserAgentConverter extends AbstractUserAgentConverter<UserAgen
private final UserAgentAnalyzer userAgentAnalyzer;

@Override
protected UserAgent create(HttpHeaders headers) {
Map<String, String> headersConcat = headers.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> String.join(",", entry.getValue())));
return userAgentAnalyzer.parse(headersConcat);
protected UserAgent create(String useragent) {
return userAgentAnalyzer.parse(useragent);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import com.blueconic.browscap.UserAgentParser;
import com.blueconic.browscap.UserAgentService;
import com.livk.context.useragent.browscap.BrowscapUserAgentConverter;
import com.livk.context.useragent.domain.UserAgent;
import com.livk.context.useragent.yauaa.YauaaUserAgentConverter;
import nl.basjes.parse.useragent.UserAgentAnalyzer;
import org.junit.jupiter.api.BeforeEach;
Expand All @@ -30,7 +29,6 @@
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;

import java.io.IOException;
Expand Down
Loading